2010-08-25 72 views
0

是否可以重写使用sqlalchemy和原始sql表达式时的默认type.DateTime行为?SQLAlchemy覆盖原始sql表达式上的types.DateTime

例如使用

myconnection.execute(text("select * from mytable where mydate > :mydate), {'mydate': mypythondatetimeobject)}

时,我想有type.DateTime从DateTime对象自动剥离时区。

更新:我发现,它的工作原理是利用bindparam和Typedecorator上像这样的查询:

class MyType(types.TypeDecorator): 
    impl = types.DateTime 

    def process_bind_param(self, value, dialect): 
     if value is not None: 
      return value.replace(tzinfo=None) 

session.execute(
    text(myquery, bindparams=[bindparam('mydateparam', 
             type_=MyType())]), 
    {'mydateparam':mydate} 
) 

,但我真的不想使用“bindparams”每个查询。是不是有可能简单地替换或重写默认的类型。

回答

1

如果您使用基于表元数据的SQL表达式,那么您只需将MyType设置在适当的列上。纯文本方法失去了一些便利。您可以将MyType粘贴到与datetime类关联的sqlalchemy.types.type_map中,尽管这当前不是公共API。

如果是我,我会怎么做:

def mytext(stmt, params): 
    bindparams = [] 
    for k, v in params: 
     if isinstance(v, datetime): 
      type_ = MyType() 
     else: 
      type_ = None 
     bindparams.append(bindparam(k, v, type_=type)) 
    return text(stmt, bindparams=bindparams) 

就用mytext的内容( “SELECT * FROM表,其中日期=:日期”,{ '日期':datetime.today()})

+0

谢谢!我现在正在使用你的“mytext”解决方案,稍作改动。 – 2010-08-27 11:48:17