SQLAlchemy:向DateTime添加Integer列
给定一个表格
class Order(db.Model):
created_at = db.Column(db.DateTime)
days = db.Column(db.Integer)
我需要写一个查询,里面有这样的FROM语句:Order.created_at + Order.days < datetime.now()
。最简单的方法不行,因为把整数加到日期时间上会变成双倍的结果 :) 这是我在用MySQL做实验后得出的结论。
经过一番搜索,我找到了解决这个问题的正确SQL语句,适用于MySQL:
SELECT *
FROM orders o
WHERE o.created_at + INTERVAL o.days DAY < '2014-06-10 14:22:00';
我想问的是,如何用sqlalchemy的filter来写上面的查询?我找到了一篇文章,讲述了如何在stackoverflow上使用Intervals,但是MySQL里没有DATEADD
,我不知道该在哪里绑定一个Interval。
抱歉我的英语不好,希望我能正确解释我的问题 :)
更新:也许正确的做法是把days
定义为Interval,但目前这不是一个选项。
3 个回答
0
这个问题虽然老旧,但对于使用PSQL或SQLAlchemy 1.0.10及以上版本的人来说,你可以使用下面的代码:
from sqlalchemy.sql import cast
db = SQLAlchemy() # Instantiated
Order.query.filter(
Order.created_at > cast('1 DAY', db.Interval) * Order.day
).all()
1
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有些人可能会在使用某个工具或库的时候,发现它的功能和用法不太清楚,这就需要我们去查找资料或者向别人请教。
在这个过程中,StackOverflow是一个非常有用的平台。这里有很多程序员分享他们的经验和解决方案,你可以在上面找到很多问题的答案,或者提出自己的问题,等待其他人来帮助你。
总之,遇到问题不要着急,先去查找资料,看看别人是怎么解决的,或者直接在社区里提问,通常都会有好心人来帮你解答。
from sqlalchemy import select, func
query = (session.query(Orders).filter(
func.DATEADD('day', Orders.days, Orders.created_at) == '2014-06-10 14:22:00'))
4
MySQL 有一个叫做 TIMESTAMPADD 的函数,听起来正是你需要的。下面是如何在查询中使用它的示例。
session.query(Order).filter(func.timestampadd(text('DAY'), Order.days, Order.created_at) < datetime(2014, 6, 10, 14, 22))