私は、両方ともFlask-SQLAlchemyを使用してsqliteデータベースにアクセスする2つのpythonアプリケーション(別々のプロセス)を持っています。そのうちの1つはasyncioモジュールを使用して設定されています(ただしFlaskアプリです)。もう1つはFlask-RESTful APIです。SQLAlchemyデータの接続が一貫していない
Flask-RESTful APIによってデータベースに書き込まれたデータがasyncioアプリケーションで表示されないという問題があります。私はこれがおそらく分離レベル(How to disable SQLAlchemy caching?)に起因すると読んだ。 session.expire_all()
を使用した場合、問題は解決しません。
これは本当に分離レベルのためですか?私の理解は、sqliteはほぼすべての時間serializable isolation levelを使用しています(私はそれが私のケースにあると信じています)。執筆中のREST APIはトランザクションをコミットしていますが、session.expire_all()
を呼び出さない限り、asyncioコードでは表示されません。これはトランザクション分離の問題のようなリーズと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
REST APIコードが 'session.commit()'を呼び出しています。データを照会したり、何も更新したり挿入したりしない非同期コードでも、 'session.commit()'も呼び出す必要があると言っていますか? – d512