Flask-SQLAlchemy 会话对象没有看到数据库的变化?
Flask-SQLAlchemy session object not seeing changes to the database?
我在 PythonAnywhere 上有一个网站,它使用连接到 MySQL 数据库的 Flask 和 Flask-SQLAlchemy。用户可以使用该网站将任务排队,该任务作为 table 中的记录保存到数据库中,然后单独的计划任务(Python 程序)检查数据库并处理每个未处理的记录。
我遇到的问题是,计划任务的数据库查询似乎只在第一次 运行s 时才找到新记录,但如果我随后使用网站添加新任务, still-运行ning 计划任务的循环数据库查询(每 5 秒一次)似乎没有检测到新记录。
对这里可能发生的事情有什么想法吗?
bash 文件 运行 的代码如下:
def generate_any_pending_videos():
unfinished_videos = db.session.query(Video)\
.filter(~Video.status.has(VideoStatus.status.in_(['Error', 'Finished', 'Video deleted'])))\
.order_by(Video.datetime_created)\
.all()
for video in unfinished_videos:
try:
logging.info("Attempting to create video for video %d" % video.id)
generate_video(video)
except Exception as e:
logging.error(str(e))
if __name__ == '__main__':
while True:
generate_any_pending_videos()
time.sleep(5)
找到了修复:出于某种原因 运行 db.session.commit()
在我的查询使新记录出现之前。
if __name__ == '__main__':
while True:
generate_any_pending_videos()
time.sleep(5)
db.session.commit() # For some reason this is needed to be able to detect newly-created videos
默认情况下,事务中的所有 SqlAlchemy 查询 运行 http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html。这就是您仅在脚本的第一次调用中获取新数据的原因。因为在一个事务里面看到的数据是不会变的,也就是ACID里面的I,事务是隔离的。
提交或回滚后,下一个查询将启动一个新事务,因此您将从数据库中获取新数据。
您可以在 sqlalchemy 引擎中更改隔离级别:
engine = create_engine(db_path, execution_options={"isolation_level": "READ COMMITTED"})
那是 mysql 默认配置的问题。
我在 PythonAnywhere 上有一个网站,它使用连接到 MySQL 数据库的 Flask 和 Flask-SQLAlchemy。用户可以使用该网站将任务排队,该任务作为 table 中的记录保存到数据库中,然后单独的计划任务(Python 程序)检查数据库并处理每个未处理的记录。
我遇到的问题是,计划任务的数据库查询似乎只在第一次 运行s 时才找到新记录,但如果我随后使用网站添加新任务, still-运行ning 计划任务的循环数据库查询(每 5 秒一次)似乎没有检测到新记录。
对这里可能发生的事情有什么想法吗?
bash 文件 运行 的代码如下:
def generate_any_pending_videos():
unfinished_videos = db.session.query(Video)\
.filter(~Video.status.has(VideoStatus.status.in_(['Error', 'Finished', 'Video deleted'])))\
.order_by(Video.datetime_created)\
.all()
for video in unfinished_videos:
try:
logging.info("Attempting to create video for video %d" % video.id)
generate_video(video)
except Exception as e:
logging.error(str(e))
if __name__ == '__main__':
while True:
generate_any_pending_videos()
time.sleep(5)
找到了修复:出于某种原因 运行 db.session.commit()
在我的查询使新记录出现之前。
if __name__ == '__main__':
while True:
generate_any_pending_videos()
time.sleep(5)
db.session.commit() # For some reason this is needed to be able to detect newly-created videos
默认情况下,事务中的所有 SqlAlchemy 查询 运行 http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html。这就是您仅在脚本的第一次调用中获取新数据的原因。因为在一个事务里面看到的数据是不会变的,也就是ACID里面的I,事务是隔离的。 提交或回滚后,下一个查询将启动一个新事务,因此您将从数据库中获取新数据。
您可以在 sqlalchemy 引擎中更改隔离级别:
engine = create_engine(db_path, execution_options={"isolation_level": "READ COMMITTED"})
那是 mysql 默认配置的问题。