我正在使用烧瓶框架下的python开发一个项目。我也使用SQLAlchemy来完成所有数据库事务。
我正在进行长轮询以检查db表中的新条目。我遇到了SQLAlchemy的问题
比较日期时间似乎并不起作用。一个有意义的解释是SQLAlchemy正在缓存结果,但从我在网上看到的情况来看,情况并非如此。
这是我的代码(对于格式不佳的道歉,无法在stackoverflow上找到它):
@app.route('/poll')
def poll():
now = datetime.utcnow()
print(models.dump_datetime(now))
timeout = time.time() + 60*1
while time.time() <= timeout:
time.sleep(0.5)
db.session.expire_all()
check = AuditLogEntry.query.filter((AuditLogEntry.datetime >= now)
& ((AuditLogEntry.action == "action1") | (AuditLogEntry.action == "action2")))
if(check.count() > 0):
for c in check:
print(c.to_dict())
break
return "DONE"
因此,当第一次调用poll()函数时,它会将时间记录为日期时间。然后,它会在数据库中搜索日期时间晚于now
的任何行。如果找到一个,它应该将它打印到控制台,并打破循环。
然而,简而言之,它并不起作用。添加新行时,时间在now
中存储的时间之后,它不会注意到它。
另外,当我测试以确保now
是正确的,并且与AuditLogEntry.datetime with the following code, I can print the count of
test`中的日期时间相当时,它是我表中的行数。所以它有效。
test = AuditLogEntry.query.filter((AuditLogEntry.datetime < now) & ((AuditLogEntry.action == "action1") |
(AuditLogEntry.action == "action2")))
print(test.count())
db.session.expire_all()似乎无法正常工作。结果集似乎没有变化。
任何帮助都将非常感谢!!!
答案 0 :(得分:0)
我尝试删除行db.session.expire_all()
,并在SQLAlchemy查询后添加了db.session.commit
,并且它可以正常工作。
我不完全确定它为何有效,如果有人能向我解释,我会很高兴:)