Flask、SQLAlchemy、SQLite - 查询今天提交的日期时间列

Flask, SQLAlchemy, SQLite - querying datetime column submitted today

我正在尝试创建一个简单的每日时间记录应用程序,它会在提交时更新 table 行。

这就是我的意思,假设员工在早上计时,那么我的 table 行将是这样的:

id time_in_am time_out_am time_in_pm time_out_pm staff_id
1 2021-05-09 08:17:07.27 NULL NULL NULL 223-8881

并在再次提交或扫描 id 后,它将更新 time_out_am,直到一天结束,即 time_out_pm.

然后我的问题就从这里开始了,我怎么知道 ID 没有的工作人员。的 223-8881 今天已经打卡了吗?

我试过这个:

today_dt = datetime(datetime.today().year, datetime.today().month, datetime.today().day)

# check if staff clocked in today
dtr_log = DailyTimeRecord.query.filter(DailyTimeRecord.time_in_am==today_dt, staff_id=staff.id).first()
# end check

使用上面的代码,我得到错误: TypeError: filter() got an unexpected keyword argument 'staff_id' 如果我使用 filter_by(),我会得到:filter_by() takes 1 positional argument but 2 were given

这是我的模型,如果有帮助的话:

class DailyTimeRecord(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    time_in_am = db.Column(db.DateTime(timezone=True))
    time_out_am = db.Column(db.DateTime(timezone=True))
    time_in_pm = db.Column(db.DateTime(timezone=True))
    time_out_pm = db.Column(db.DateTime(timezone=True))
    staff_id = db.Column(db.Integer, db.ForeignKey('staff.id'))

当您使用 filter 时,您需要指定模型并使用 'proper' 比较,例如:staff_id=staff.id 应该是 DailyTimeRecord.staff_id==staff.id 所以看起来像:

dtr_log = DailyTimeRecord.query.filter(
    DailyTimeRecord.time_in_am==today_dt, 
    DailyTimeRecord.staff_id==staff.id
).first()

如果您使用的是 filter_by 助手,它看起来像:

dtr_log = DailyTimeRecord.query.filter(
    time_in_am=today_dt, 
    staff_id=staff.id
).first()

但是您也会 运行 遇到日期比较问题。 time_in_am 是一个 datetime,你正在构建一个日期时间来与之比较,但本质上你的 today_dt 是一个午夜的日期时间(小时、分钟、秒将默认为零,因为你没有给他们一个价值)。

您真的只想处理日期到日期的比较——所以想要将数据库值也转换为日期来执行您提到的操作,因此 filter:

from sqlalchemy import func
from datetime import date

today_dt = date.today()

dtr_log = DailyTimeRecord.query.filter(
    func.date(DailyTimeRecord.time_in_am)==today_dt, 
    DailyTimeRecord.staff_id==staff.id
).first()