2017-02-10 3 views
1

私はサービスの各エンドポイントでは、パターンセッションではなくエンジン/接続でSQLAlchemyをスレッドセーフで使用できますか?

engine = create_engine(database_uri) 
connection = engine.connect() 

を使用してデータベースに接続するためにSQLAlchemyのを使用して簡単なWebサービスを持って、私は次の方法で、同じ接続を使用します。

for result in connection.execute(query): 
    <do something fancy> 

Sessionはスレッドセーフではありませんので、connectionもスレッドセーフではありません。

これをしっかり続けることはできますか?そうでない場合、それを修正する最も簡単な方法は何ですか?

マイナーノート - サービスがマルチスレッドで実行されるかどうかはわかりませんが、私はむしろ問題が発生しないことを確信しています。

+0

私はあなたの質問に答えがありませんが、私は返答として質問をしたかったのです。本当にORMが必要ですか?私はこれが個人的な選択の問題だと知っていますが...あなたのデータがリモートでもクリーンであれば、pyodbcを使用してカーソルを使うことができます。 – Kelvin

+0

誰かがORMを使用する必要はないと思います。このケースでは、データベースが自分のコントロールから変わってしまったので、私は(個人的に)より簡単になりました。クエリの中には非常に複雑なものもあり、sqlalchemyを使用して正しいことがわかりやすく(個人的にも)、SQLは非常に冗長です。 – Clearer

+1

大丈夫です。 +1を使用する正当な理由があります:) – Kelvin

答えて

1

短い回答:あなたは大丈夫でしょう。

connectionSessionの間に違いがあります。簡単な説明は、接続がちょうど...データベースへの接続を表すということです。あなたがそれに渡す情報はきれいに出てくるでしょう。あなたがそれを伝えない限り、あなたの取引を追跡することはなく、あなたはそれにデータを送る順序を気にしません。したがって、Sprocketオブジェクトを作成する前にWidgetオブジェクトを作成することが重要な場合は、スレッドセーフなコンテキストでそれを呼び出す方がよいでしょう。データベーストランザクションを追跡したい場合は、同じことが一般的になります。

Sessionは、あなたのためのデータとトランザクションを追跡します。 check out the source codeの場合、データベーストランザクションの前後にかなりの違いがあることがわかります。トランザクションに必要なものがすべてあることを知る方法がなければ、1つのスレッドでコミットすることができます別のオブジェクトを別のオブジェクトに追加することができます。


場合、あなたは取引がthis is Wikipediaあるかわからないが、短いバージョンはトランザクションがあなたのデータは安定したまま確認して助けるということです。 15個の挿入と更新があり、15個の挿入が失敗した場合は、残りの14個を作成したくないかもしれません。トランザクションによって、操作全体を一括して取り消すことができます。

+0

私は書いているのではなく、サーバーからデータを読み込んでいます。私は安全でなければならないと思う。 – Clearer

+2

@Clearerドキュメンテーションは、[接続オブジェクトはスレッドセーフではありません](http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.Connection)を明示しています。基礎となるDBAPI接続がスレッドセーフであるかどうかは、特定のドライバによって異なります。 – univerio

+0

@univerioこれを解決するには、connection.connect()を呼び出して戻り値を使用するだけですか?私が知る限り、これは安全なものでなければなりません。 – Clearer

関連する問題