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.

Reply via email to