Sqlite SQLAlchemy数据在连接之间不一致
我有两个python应用程序(单独的进程),它们都用来访问sqlite数据库。其中一个是使用模块设置的(但仍然是Flask应用程序),另一个是API 我发现了一个问题,异步IO应用程序看不到由Flask RESTful API写入数据库的数据。我已经读到这可能是由于隔离级别()。如果我使用,问题就会消失 那么这真的是因为隔离级别吗?我的理解是,sqlite几乎一直在使用(我相信我的情况就是这样)。正在编写的REST API正在提交其事务,但除非调用Sqlite SQLAlchemy数据在连接之间不一致,sqlite,sqlalchemy,python-asyncio,isolation-level,flask-restful,Sqlite,Sqlalchemy,Python Asyncio,Isolation Level,Flask Restful,我有两个python应用程序(单独的进程),它们都用来访问sqlite数据库。其中一个是使用模块设置的(但仍然是Flask应用程序),另一个是API 我发现了一个问题,异步IO应用程序看不到由Flask RESTful API写入数据库的数据。我已经读到这可能是由于隔离级别()。如果我使用,问题就会消失 那么这真的是因为隔离级别吗?我的理解是,sqlite几乎一直在使用(我相信我的情况就是这样)。正在编写的REST API正在提交其事务,但除非调用session.expire\u all(),否
session.expire\u all()
,否则异步IO代码不会看到它们。这看起来像是事务隔离问题,更像是SQLAlchemy问题,但我不是100%确定
在查询数据库之前,我是否必须始终记住调用会话。使\u 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
默认情况下,
SQLAlchemy
在处理程序退出之前不会提交更改,您需要显式调用session.commit()
但是,使用异步协同程序中的同步
SQLAlchemy
代码,即使在相对适中的负载下,也会有效地降低性能。REST api代码正在调用session.commit()
。你是说即使是异步代码,也需要调用session.commit()?