Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy在原始sql表达式上重写types.DateTime_Python_Postgresql_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy在原始sql表达式上重写types.DateTime

Python SQLAlchemy在原始sql表达式上重写types.DateTime,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,在对原始sql表达式使用sqlalchemy时,是否可以覆盖默认的type.DateTime行为 例如使用 myconnection.execute(text(“select*from mytable where mydate>:mydate),{'mydate':mypythondatetimeobject)} ,我想让type.DateTime自动从DateTime对象中删除时区 更新:我发现它是通过在查询中使用bindparam和Typedecorator工作的,如下所示: class M

在对原始sql表达式使用sqlalchemy时,是否可以覆盖默认的type.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”“在每一个问题上。是否可以简单地替换或覆盖默认的types.DateTime行为?

如果使用基于表元数据的SQL表达式,则只需在相应的列上设置MyType即可。纯文本方法失去了一些便利。您可以将MyType粘贴到datetime类的sqlalchemy.types.type_映射中,尽管这目前不是公共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(“从date=:date的表中选择*,{'date':datetime.today()})

谢谢!我现在正在使用您的“mytext”解决方案,稍作调整。