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()
我正在尝试创建一个简单的每日时间记录应用程序,它会在提交时更新 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()