按日期筛选/获取项目



数据库模型:

class Expense(Base):
__tablename__ = "expenses"
id = Column(Integer, primary_key=True, unique = True, index=True)
item = Column(String, index=True)
price = Column(String, index=True)
currency = Column(String, index=True)
created_at = Column(DateTime, default=date.today())

使用SQLAlchemy,我想获得今天添加的所有项目。

我试过了:

today = date.today()
res = db.query(Expense).filter(Expense.created_at == today).all()

但是date.today()返回2022-09-16,而Expense.created_at2022-09-16 00:00:00。此外,我尝试存储created_at = Column(DateTime, default=datetime.now())并查询类似:

today = datetime.now().day
res = db.query(Expense).filter(Expense.created_at.day == today).all()

但它返回一个错误。

有几种方法可以解决这个问题:第一种是使用between来筛选某个日期,因为您的字段是DateTime,所以它会比较确切的日期和时间。因此,这里有一个例子:

today = datetime.now()
start = today.replace(hour=0, minute=0, second=0)
end = today.replace(hour=23, minute=59, second=59)
res = db.Qeury(Expense).filter(Expense.created_at.between(start, end)).all()

第二种方法是在DB内置函数之上使用SQLAlchemy层。有一个内置函数date,用于获取DateTime字段的日期。这里有一个例子:

from sqlalchemy import func
today = datetime.now().date()
res = db.Query(Expense).filter(func.date(Expense.created_at) == today).all()

此外,我看到你在设置一个列时犯了一个小错误:

created_at = Column(DateTime, default=date.today())

这意味着,每当您没有将created_at列提供给模型时,created_at将是流程开始的日期,正如您所调用的函数today()一样。

Default期望接收可调用的,而不是函数,所以它应该是这样的:

created_at = Column(DateTime, default=date.today)

这样,当需要默认值时,它每次都会调用函数date.today

最新更新