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.

Reply via email to