使用SQLALCHEMY在Python Flask中进行长轮询

时间:2015-04-09 11:28:52

标签: python mysql flask sqlalchemy long-polling

我正在使用烧瓶框架下的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()似乎无法正常工作。结果集似乎没有变化。

任何帮助都将非常感谢!!!

1 个答案:

答案 0 :(得分:0)

我尝试删除行db.session.expire_all(),并在SQLAlchemy查询后添加了db.session.commit,并且它可以正常工作。

我不完全确定它为何有效,如果有人能向我解释,我会很高兴:)