Ofi*_*fir 2 python sqlalchemy date
请考虑下表:
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)
Run Code Online (Sandbox Code Playgroud)
如何在sqlalchemy中的原始sql中选择使用字符串而不是日期?以下适用于mysql但不适用于Oracle:
session.query(Employee).\
filter("end_date IS NULL OR end_date>='%s'" % datetime.now()).all()
Run Code Online (Sandbox Code Playgroud)
最好的情况是,如果我可以在处理Date或DateTime列时使用字符串或日期(可互换)(我尝试过TypeDecorator无效)
请注意,问题是指原始 sql(我知道这可以使用谓词完成)...
不要使用字符串格式将值插入SQL.对于一个datetime对象,默认的字符串格式恰好适用于MySQL,但这只是偶然性和运气.
在这种情况下,不要使用原始SQL并让SQLAlchemy将datetime对象转换为后端数据库为您理解的内容:
from sqlalchemy import or_
session.query(Employee).filter(
or_(Employee.end_date == None, Employee.end_date >= datetime.now())
).all()
Run Code Online (Sandbox Code Playgroud)
即使使用原始SQL,我也会使用sqlalchemy生成该SQL并使用绑定参数:
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()
Run Code Online (Sandbox Code Playgroud)
该过滤器表达式将转换为适用于您的数据库后端的正确转义SQL,无论后端是什么.如果未设置后端,则表达式变为:
>>> str(or_(end_date == None, end_date >= dtnow))
'enddate IS NULL OR enddate >= :dtnow'
Run Code Online (Sandbox Code Playgroud)
并且该datetime.now()值将在执行时作为SQL参数传递给后端数据库游标.
最后一种方法是使用以下text()类型:
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()
Run Code Online (Sandbox Code Playgroud)
否则我会避免混合原始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())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4261 次 |
| 最近记录: |