Flask sqlalchemy db.session.commit 没有效果的问题
在对数据库进行更新某条数据时,发现db.session.commit()没有效果,但是做调试能把赋值都正常打印出来,程序也不报错。
cur_file = FileStatus.query.filter_by(file_name='xxx').first()
cur_file.file_name = 'abc'
cur_file.size = 100000
print(cur_file.file_name)
print(cur_file.size)
db.session.commit()
当时的代码大致如上,用model.query取出一条数据,对数据的属性进行修改,最后commit。但是运行后,数据库中并没有被更新。
在阅读flask-sqlalchemy和sqlalchemy相关协议后,发现使用类似FileStatus.query.filter_by(file_name=‘xxx’).first()的查询,返回的是一个sqlalchemy.orm.query.Query对象的副本,所以对它进行修改只能在当前程序运行中有效,程序运行完毕,数据还是原来的样子,并没有被更新。
正确的做法应该是:
cur_file = db.session.query(FileStatus).filter_by(file_name=‘xxx’).first()
这样得到的对象不是副本,对它的修改能以UPDATE的形式更新到数据库。
另外还有遇到db.session不一致的问题,我的解决办法是首先检测是不是写了多个db = SQLAlchemy(app), 然后保持在一个函数中只commit一次就没有报错了。
另外也可以利用python上下文来保持session一致:
with db.session as session_1:
…
在使用Flask-SQLAlchemy更新数据库记录时,遇到commit无效果的困扰。问题源于使用Model.query.filter_by()获取的是查询对象的副本,而非实际对象,导致修改无法持久化。正确做法是直接通过db.session.query()获取对象,确保修改能被提交。此外,db.session的一致性问题可能由多次初始化或未正确管理session引起,应避免多次commit并合理使用session上下文管理。
1740

被折叠的 条评论
为什么被折叠?



