在SQLAlchemy里查7天前的数据,直接用datetime和timedelta就行,比找TO_DAYS的替代方案更直接。下面是个完整例子:
from datetime import datetime, timedelta
from sqlalchemy import create_engine, Column, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import func
Base = declarative_base()
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
created_at = Column(DateTime)
# 创建连接和会话
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# 计算7天前的时间点
seven_days_ago = datetime.now() - timedelta(days=7)
# 查询7天前的数据
results = session.query(MyTable).filter(MyTable.created_at < seven_days_ago).all()
for row in results:
print(row.id, row.created_at)
关键就这一行:MyTable.created_at < seven_days_ago。datetime.now() - timedelta(days=7)算出7天前的时间点,然后直接比较就行。
如果你非要用类似TO_DAYS的函数,SQLAlchemy的func模块也能实现,但更啰嗦:
from sqlalchemy import func
# 假设用MySQL
results = session.query(MyTable).filter(
func.to_days(func.now()) - func.to_days(MyTable.created_at) > 7
).all()
不过真没必要,第一个方法更清晰,而且数据库无关。
总结:用datetime计算时间点然后直接比较最省事。