hjaycee
V2EX  ›  Flask

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

  •  
  •   hjaycee · Jan 23, 2018 · 7488 views
    This topic created in 3208 days ago, the information mentioned may be changed or developed.
    # 插入代码
    user = UserModel(username='aaa')
    db.session.add(user)
    db.session.commit()

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

    除非重启服务,不然一直查不到这条新数据,这是为什么呢?
    Supplement 1  ·  Jan 23, 2018

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

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

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

    Supplement 2  ·  Jan 24, 2018

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

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

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

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

    Supplement 3  ·  Jan 24, 2018

    附上踩完坑的demo: python_api

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

    哦... 我查询的大部分还是直接裸写的 sql ... Orz
    flniu
    flniu
    Jan 23, 2018
    12
    不要使用 autocommit
    lgh
    lgh
    Jan 23, 2018 via iPhone
    13
    把你的 query 也 commit 一下,别问我怎么知道的
    glasslion
    glasslion
    Jan 24, 2018
    14
    我前一阵从 Django 转 Flask 时, 也遇到过一模一样的问题, 忘记怎么解决了。 只记得开发时用 flask run 没有问题, 放到线上用 gunicorn 才出现问题
    octobersnow
    octobersnow
    May 21, 2018 via iPhone
    15
    @flniu 为什么不要使用 autocommit?求大佬解释
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3056 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 11:07 · PVG 19:07 · LAX 03:07 · JFK 06:07
    ♥ Do have faith in what you're doing.