0

私は、両方とも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 

答えて

1

SQLAlchemyは、ハンドラが終了するまで、デフォルトでは、変更をコミットしていない、あなたは明示的session.commit()を呼び出す必要があります。

しかし、非同期コルーチンからの同期SQLAlchemyコードを使用すると、効果的にパフォーマンスを殺すも、相対的な適度な負荷の下で、あなたは知っています。

+0

REST APIコードが 'session.commit()'を呼び出しています。データを照会したり、何も更新したり挿入したりしない非同期コードでも、 'session.commit()'も呼び出す必要があると言っていますか? – d512

関連する問題