V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hjaycee
V2EX  ›  Flask

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

  •  
  •   hjaycee · 2018-01-23 14:57:04 +08:00 · 6107 次点击
    这是一个创建于 2489 天前的主题,其中的信息可能已经有所发展或是发生改变。
    # 插入代码
    user = UserModel(username='aaa')
    db.session.add(user)
    db.session.commit()

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

    除非重启服务,不然一直查不到这条新数据,这是为什么呢?
    第 1 条附言  ·  2018-01-23 16:14:21 +08:00

    这个库也太坑了,我用的数据库是mysql,使用的库和版本如下:

    pymysql == 0.8.0
    flask_restful == 2.3
    
    # 设置了自动提交,改完数据后调用下面两个方法也不起作用
    db.session.flush
    db.session.close()
    

    其它人也和我一样碰到这个问题:

    第 2 条附言  ·  2018-01-24 10:33:06 +08:00

    多谢大家帮助,自己找到解决办法了

    查询用db.session.query去查询,不要用文档中的查询方式model.query(真的很坑)

    # 错误
    UserModel.query.all()
    # 正确
    db.session.query(UserModel).all()
    

    这个查询方式我还是从这里看到的,文档上没写

    第 3 条附言  ·  2018-01-24 13:01:07 +08:00

    附上踩完坑的demo: python_api

    15 条回复    2018-05-21 08:56:57 +08:00
    jingniao
        1
    jingniao  
       2018-01-23 15:07:42 +08:00 via Android
    mysql ?注意隔离级别
    hjaycee
        2
    hjaycee  
    OP
       2018-01-23 15:22:38 +08:00
    @jingniao 业务层没这么复杂吧?我都已经提交事务了
    ilovebaicai
        3
    ilovebaicai  
       2018-01-23 15:39:37 +08:00
    参考这个看一下: https://segmentfault.com/q/1010000002852369
    0Y89tX3MgR4I
        4
    0Y89tX3MgR4I  
       2018-01-23 15:46:04 +08:00 via Android
    直接上 SQLalchemy,没几行代码,更加灵活
    hcymk2
        5
    hcymk2  
       2018-01-23 15:46:48 +08:00
    把 SQL 日志输出看下。
    Beebird
        6
    Beebird  
       2018-01-23 15:57:05 +08:00
    可能需要 db.session.flush() 一下
    Hstar
        7
    Hstar  
       2018-01-23 16:34:56 +08:00
    那么是这条数据没插进去还是一直查不出来?
    hjaycee
        8
    hjaycee  
    OP
       2018-01-23 16:48:29 +08:00
    @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
        9
    jingniao  
       2018-01-23 18:55:27 +08:00 via Android
    mysql 事务隔离级别 默认是 可重复读 repeatable read
    也就是同一个连接 多次读取相同记录时,保证读到的内容是一致的
    你改为 read committed
    以上更改需要设置在 mysqld 配置文件中或者设置当然 sessein/连接
    另外 sqlalchemy 默认是做了 session 缓存,这也是一个原因
    jingniao
        10
    jingniao  
       2018-01-23 19:01:52 +08:00 via Android
    @jingniao 也可能不是这个问题🤗
    likuku
        11
    likuku  
       2018-01-23 19:07:58 +08:00
    最近在用 sqlite3 + flask-sqlalchemy,没这个问题... sqalchemy 也是用了 session,

    哦... 我查询的大部分还是直接裸写的 sql ... Orz
    flniu
        12
    flniu  
       2018-01-23 22:46:34 +08:00
    不要使用 autocommit
    lgh
        13
    lgh  
       2018-01-23 23:07:16 +08:00 via iPhone
    把你的 query 也 commit 一下,别问我怎么知道的
    glasslion
        14
    glasslion  
       2018-01-24 10:46:15 +08:00
    我前一阵从 Django 转 Flask 时, 也遇到过一模一样的问题, 忘记怎么解决了。 只记得开发时用 flask run 没有问题, 放到线上用 gunicorn 才出现问题
    octobersnow
        15
    octobersnow  
       2018-05-21 08:56:57 +08:00 via iPhone
    @flniu 为什么不要使用 autocommit?求大佬解释
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1096 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 23:33 · PVG 07:33 · LAX 15:33 · JFK 18:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.