【问题标题】:SQLAlchemy data not consistent across connectionsSQLAlchemy 数据在连接之间不一致
【发布时间】:2017-01-04 11:57:30
【问题描述】:

我有几个 python 应用程序(单独的进程),它们都使用Flask-SQLAlchemy 来访问 sqlite 数据库。其中一个是使用 asyncio 模块(但仍然是 Flask 应用程序)设置的,另一个是 Flask-RESTful API。

我看到一个问题,即 asyncio 应用程序看不到 Flask-RESTful API 写入数据库的数据。我读到这可能是由于隔离级别 (How to disable SQLAlchemy caching?)。如果我使用session.expire_all(),问题就会消失。

那么这真的是由于隔离级别造成的吗?我的理解是 sqlite 几乎一直使用serializable isolation level(我相信在我的情况下)。正在编写的 REST API 正在提交其事务,但异步代码只是看不到它们,除非我调用 session.expire_all()。这似乎是一个事务隔离问题,更像是一个 SQLAlchemy 问题,但我不是 100% 确定。

我是否只需要在查询数据库之前始终记得致电session.expire_all()?有没有更好的方法来保持应用之间的一致性?

如果有帮助,这里有一些代码:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)    
db = SQLAlchemy(app)

@asyncio.coroutine
def grab_data_off_queue(self):
    while True:
        try:
            hit = self.hit_queue.get(False)

            # required for this session to see the changes made by REST api
            db.session.expire_all()

            rows = MyTable.query.filter_by.all()

            for row in rows:
                # the REST API is setting field_2 to 123,
                # but this session cannot see those changes
                if row.field_2 == 123:
                     do_something() #execution never gets here

这里是 REST API:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)    
db = SQLAlchemy(app)

class MyApi(Resource):
    def put(self, id):
         row = MyTable.query.filter_by(table_id=id).one()
         row.field_2 = 123
         db.session.commit()
         return '', 204

【问题讨论】:

    标签: sqlite sqlalchemy python-asyncio isolation-level flask-restful


    【解决方案1】:

    SQLAlchemy 在处理程序退出之前默认不会提交更改,您需要显式调用session.commit()

    但是使用来自异步协程的同步 SQLAlchemy 代码会有效地降低性能即使在相对中等的负载下你知道。

    【讨论】:

    • REST api 代码调用session.commit()。你是说即使只是查询数据而不更新或插入任何内容的异步代码也需要调用session.commit()
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 2020-12-20
    • 2016-05-11
    • 2017-01-23
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多