Flask sqlalchemy db.session.commit 没有效果的问题

在使用Flask-SQLAlchemy更新数据库记录时,遇到commit无效果的困扰。问题源于使用Model.query.filter_by()获取的是查询对象的副本,而非实际对象,导致修改无法持久化。正确做法是直接通过db.session.query()获取对象,确保修改能被提交。此外,db.session的一致性问题可能由多次初始化或未正确管理session引起,应避免多次commit并合理使用session上下文管理。

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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值