[sqlalchemy] Custom UTC DateTime Type with Custom insert functionality

2011-02-08 Thread chris e
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:

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 at 
http://groups.google.com/group/sqlalchemy?hl=en.



Re: [sqlalchemy] Custom UTC DateTime Type with Custom insert functionality

2011-02-08 Thread Michael Bayer

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 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.