sqlite 按日期筛选/获取项目

twh00eeo  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(315)

数据库模型:

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-16Expense.created_at返回2022-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()

但它返回一个错误。

njthzxwz

njthzxwz1#

有几种方法可以解决这个问题:第一种方法是使用BETWAGE来筛选某个日期,因为您的字段是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()

第二种方法是使用SQLAlChemy Layer Over DB内置函数。有一个内置的函数date可以获取日期时间字段的日期。下面是一个例子:

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期望接收Callable,而不是Function,因此它应该如下所示:

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

这样,当需要缺省值时,它将每次调用函数date.today

相关问题