gpt4 book ai didi

python - sqlalchemy 日期作为原始 sql 中的字符串

转载 作者:行者123 更新时间:2023-11-28 20:49:05 25 4
gpt4 key购买 nike

考虑下表:

class Employee(Base):
__tablename__ = "t_employee"

id = Column(Integer(20), Sequence('%s_id_seq' % __tablename__), primary_key=True)
first_name = Column(String(30))
last_name = Column(String(30))
email = Column(String(50))
start_date = Column(Date, default=datetime.now)
end_date = Column(Date)

如何在 sqlalchemy 的原始 sql 中选择使用字符串而不是日期?以下内容适用于 mysql 但不适用于 Oracle:

session.query(Employee).\
filter("end_date IS NULL OR end_date>='%s'" % datetime.now()).all()

最好的情况是,如果我在处理 Date 或 DateTime 列时可以使用字符串或日期(可互换)(我尝试过 TypeDecorator 无济于事)

请注意问题涉及原始 sql(我知道这可以使用谓词来完成)...

最佳答案

不要使用字符串格式将值插入到 SQL 中。对于 datetime 对象,默认的字符串格式恰好适用于 MySQL,但这只是机缘巧合。

在这种情况下,不要使用原始 SQL 并让 SQLAlchemy 将日期时间对象转换为后端数据库为您理解的内容:

from sqlalchemy import or_

session.query(Employee).filter(
or_(Employee.end_date == None, Employee.end_date >= datetime.now())
).all()

即使在使用原始 SQL 时,我也会让 sqlalchemy 生成该 SQL 并使用绑定(bind)参数:

from sqlalchemy.sql.expression import bindparam, column
from sqlalchemy.types import DateTime
from sqlalchemy import or_

dtnow = bindparam('dtnow', datetime.now(), DateTime)
end_date = column('enddate', DateTime)

session.query(Employee).\
filter(or_(end_date == None, end_date >= dtnow)).all()

无论后端是什么,该过滤器表达式都会为您的数据库后端转换为正确转义的 SQL。当没有设置后端时,表达式变为:

>>> str(or_(end_date == None, end_date >= dtnow))
'enddate IS NULL OR enddate >= :dtnow'

并且datetime.now()值会在执行时作为SQL参数传入后端数据库游标。

最后的手段是使用 text() type :

from sqlalchemy.sql.expression import bindparam, text

dtnow = bindparam('dtnow', datetime.now(), DateTime)
session.query(Employee).\
filter(text('end_date is NULL or end_date >= :dtnow', bindparams=[dtnow])).all()

否则我会避免完全混合使用原始 SQL 和 SQLAlchemy ORM。仅对数据库连接直接使用原始 SQL:

conn = session.connection()
conn.execute(text('SELECT * FROM t_employee WHERE end_date IS NULL OR end_date>=:dtnow'),
dtnow=datetime.now())

关于python - sqlalchemy 日期作为原始 sql 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15477817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com