【发布时间】: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