OK that ticket is complete if you feel like trying the default tip or 0.6 branch:
0.6: http://hg.sqlalchemy.org/sqlalchemy/archive/rel_0_6.tar.gz tip: http://hg.sqlalchemy.org/sqlalchemy/archive/default.tar.gz On Feb 9, 2011, at 12:52 AM, Michael Bayer wrote: > Yeah, thats because the compiler extension, wrapped directly around > _BindParamClause, is not called on an insert, when the bind is generated > within the compile. That is why I made ticket #2042. Not going to work > until I get around to that. > > It would work if you generated the bindparam() yourself, as occurs with > literal(), i.e. table.insert().values(date=literal(some_date, > type=UTCNowColumn()), but that's not the general INSERT form that gets used > with the ORM and such. > > > > > On Feb 8, 2011, at 11:25 PM, chris e wrote: > >> I understand that's the case for defaults, but to test the code I >> actually set a value for one of the columns that is of type >> UTCTimestamp, and the compiler extension was never called. I'm >> stumped. >> >> That said, I can keep moving, I've decided to just use oracle >> timestamps without timezones, and always convert to UTC since >> cx_Oracle doesn't handle timezones properly. >> >> On Feb 8, 7:18 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: >>> The TypeDecorator is not used for defaults. You set >>> "default=utc_timestamp()" on your Column. The SQL expression is rendered >>> directly in the INSERT when no value given, no bind params used. >>> >>> On Feb 8, 2011, at 10:13 PM, chris e wrote: >>> >>>> I now have the code below, but the _oracle_utc_timestamp function is >>>> never called, even when I do explicitly set a value. >>> >>>> class UTCTimestamp(TypeDecorator): >>>> impl = TIMESTAMP >>> >>>> # add the UTC time zone info to naive timestamps >>>> def process_result_value(self, value, dialect) : >>>> if value != None : >>>> value = UTC.localize(value) >>> >>>> return value >>> >>>> def process_bind_param(self, value, dialect): >>>> # if we have a value convert it to UTC if needed >>>> if value != None : >>>> if value.tzinfo : >>>> value = value.astimezone(UTC) >>>> return value >>> >>>> class utc_timestamp(FunctionElement): >>>> type = DateTime() >>> >>>> @compiles(utc_timestamp) >>>> def _oracle_utc_timestamp(element, compiler, **kw): >>>> import pdb >>>> pdb.set_trace() >>> >>>> On Feb 8, 6:09 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: >>>>> On Feb 8, 2011, at 4:56 PM, chris e wrote: >>> >>>>>> To simplify date handling in a project on which I am working, I am >>>>>> storing UTC dates in the database in a timestamp with timezone field, >>>>>> however, because cx_Oracle does not have any timezone functionality, I >>>>>> need to cast the UTC timestamp I'm inserting into the database as a >>>>>> timestamp in UTC so that the database does not convert it to the db >>>>>> timezone. This also needs to apply to default values. >>> >>>>>> I have the following, however, it is not called for default values: >>> >>>>> The @compiles for _BindParamClause was never expected and is not covered >>>>> within a visit_insert() right now. Ticket #2042 is added. However, >>>>> you're better off using SQL level UTC functions for defaults in any case >>>>> which would be the workaround here. Here's one I use for PG + SQL >>>>> Server. You can add another for Oracle that includes your CAST >>>>> expression if needed: >>> >>>>> class utcnow(expression.FunctionElement): >>>>> type = DateTime() >>> >>>>> @compiles(utcnow, 'postgresql') >>>>> def _pg_utcnow(element, compiler, **kw): >>>>> return "TIMEZONE('utc', CURRENT_TIMESTAMP)" >>> >>>>> @compiles(utcnow, 'mssql') >>>>> def _ms_utcnow(element, compiler, **kw): >>>>> return "GETUTCDATE()" >>> >>>>>> from pytz import UTC >>>>>> class UTCDateTime(TypeDecorator): >>>>>> impl = TIMESTAMP >>> >>>>>> # add the UTC time zone info to naive timestamps >>>>>> def process_result_value(self, value, dialect) : >>>>>> if value != None : >>>>>> value = UTC.localize(value) >>> >>>>>> return value >>> >>>>>> @compiles(_BindParamClause) >>>>>> def _compile_utc_date(element, compiler, **kw): >>>>>> if isinstance(element.type, UTCDateTime) : >>>>>> return "from_tz(cast(%s as timestamp), 'UTC')" \ >>>>>> % compiler.visit_bindparam(element, **kw) >>> >>>>>> return compiler.visit_bindparam(element, **kw) >>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "sqlalchemy" group. >>>>>> To post to this group, send email to sqlalchemy@googlegroups.com. >>>>>> To unsubscribe from this group, send email to >>>>>> sqlalchemy+unsubscr...@googlegroups.com. >>>>>> For more options, visit this group >>>>>> athttp://groups.google.com/group/sqlalchemy?hl=en. >>> >>>> -- >>>> You received this message because you are subscribed to the Google Groups >>>> "sqlalchemy" group. >>>> To post to this group, send email to sqlalchemy@googlegroups.com. >>>> To unsubscribe from this group, send email to >>>> sqlalchemy+unsubscr...@googlegroups.com. >>>> For more options, visit this group >>>> athttp://groups.google.com/group/sqlalchemy?hl=en. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To post to this group, send email to sqlalchemy@googlegroups.com. >> To unsubscribe from this group, send email to >> sqlalchemy+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/sqlalchemy?hl=en. >> > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalchemy@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.