使用 flask_sqlalchemy 插入新数据后,查询表还是旧的数据

2018 年 1 月 23 日
 hjaycee
# 插入代码
user = UserModel(username='aaa')
db.session.add(user)
db.session.commit()

# 查询代码
isExist = UserModel.query.filter_by(username='aaa').first()

除非重启服务,不然一直查不到这条新数据,这是为什么呢?
6738 次点击
所在节点    Flask
15 条回复
jingniao
2018 年 1 月 23 日
mysql ?注意隔离级别
hjaycee
2018 年 1 月 23 日
@jingniao 业务层没这么复杂吧?我都已经提交事务了
ilovebaicai
2018 年 1 月 23 日
参考这个看一下: https://segmentfault.com/q/1010000002852369
0Y89tX3MgR4I
2018 年 1 月 23 日
直接上 SQLalchemy,没几行代码,更加灵活
hcymk2
2018 年 1 月 23 日
把 SQL 日志输出看下。
Beebird
2018 年 1 月 23 日
可能需要 db.session.flush() 一下
Hstar
2018 年 1 月 23 日
那么是这条数据没插进去还是一直查不出来?
hjaycee
2018 年 1 月 23 日
@Hstar 插进去了,可以在数据库里看到,只是在不重启服务的情况下用代码查不出来

~~~
user = UserModel(username='a')
db.session.add(user)
db.session.commit()

a = UserModel.query.all()
print a
# a = []

user = UserModel(username='b')
db.session.add(user)
db.session.commit()

a = UserModel.query.all()
print a
# a = []

user = UserModel(username='c')
db.session.add(user)
db.session.commit()

a = UserModel.query.all()
print a
# a = []
~~~
jingniao
2018 年 1 月 23 日
mysql 事务隔离级别 默认是 可重复读 repeatable read
也就是同一个连接 多次读取相同记录时,保证读到的内容是一致的
你改为 read committed
以上更改需要设置在 mysqld 配置文件中或者设置当然 sessein/连接
另外 sqlalchemy 默认是做了 session 缓存,这也是一个原因
jingniao
2018 年 1 月 23 日
@jingniao 也可能不是这个问题🤗
likuku
2018 年 1 月 23 日
最近在用 sqlite3 + flask-sqlalchemy,没这个问题... sqalchemy 也是用了 session,

哦... 我查询的大部分还是直接裸写的 sql ... Orz
flniu
2018 年 1 月 23 日
不要使用 autocommit
lgh
2018 年 1 月 23 日
把你的 query 也 commit 一下,别问我怎么知道的
glasslion
2018 年 1 月 24 日
我前一阵从 Django 转 Flask 时, 也遇到过一模一样的问题, 忘记怎么解决了。 只记得开发时用 flask run 没有问题, 放到线上用 gunicorn 才出现问题
octobersnow
2018 年 5 月 21 日
@flniu 为什么不要使用 autocommit?求大佬解释

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/425249

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX