2017-12-08 18 views
1

私はFlaskで簡単なプロジェクトを作成する必要があります。私はSQLAlchemyを使いたくありません。以下のコードスニペットでは、サーバーに接続するすべてのユーザーが同じ接続オブジェクトを使用しますが、要求ごとに新しいカーソルオブジェクトが作成されます。私はこの方法でPython DB APIを使用したことがないので、これを尋ねています。それが正しいか?要求ごとに新しい接続オブジェクトを作成するか、以下の各要求またはメソッドごとに同じ接続およびカーソルオブジェクトを使用する必要があります。どちらが正しいか?WSGIアプリケーションでグローバルデータベース接続が許可されていますか?

import mysql.connector 
from flask import Flask, request 
app = Flask(__name__) 

try: 
    con = mysql.connector.connect(user='root',password='',host='localhost',database='pywork') 
except mysql.connector.Error as err: 
    print("Something went wrong") 

@app.route('/') 
def home(): 
    cursor = con.cursor() 
    cursor.execute("INSERT INTO table_name VALUES(NULL,'test record')") 
    con.commit() 
    cursor.close() 
    return "" 
+0

。 – moooeeeep

+0

@moooeeeepはい、あなたは正しいです。間もなく、コネクションオブジェクトを使用して、commitメソッドを使用してSqlクエリを実行します。私はそれについて考えなかった。ご協力いただきありがとうございます。 – amone

答えて

0

WSGIアプリケーションは、複数のワーカープロセスおよびスレッドによって提供されることがあります。したがって、同じ接続を使用して複数のスレッドを持つことになります。したがって、ライブラリの実装がスレッドセーフであるかどうかを調べる必要があります。ドキュメントを調べて、Level 2 thread safetyを提供すると主張しているかどうかを確認します。

次に、リクエスト中に取引が必要かどうかを確認する必要があります。トランザクションが必要な場合(たとえば、要求が複数のデータベースコマンドの間に不整合な状態または可能な競合条件を指定して複数のデータベースコマンドを発行する場合など)、トランザクションは常に接続が広いため、異なる接続を使用する必要があります。一部のデータベースシステムまたは構成では、トランザクションをサポートしていないか、お互いに別々の接続を分離していないことに注意してください。

したがって、接続を共有する場合は、autocommitが有効になっている(またはそれより優れていることを実際に行っている)と仮定してください。おそらくあなたはできるだけ早く要求ごとにデータベースのコマンドは、データベースが不整合な状態にあることを避けるためにトランザクションを必要とする要求ごとに個別の接続を持っている必要があり、接続ではなく、カーソルにバインドされている(使用可能な場合)の取引について反映した後

+0

私はapacheを使ってこのアプリケーションを配備することを計画しています。この場合、接続オブジェクトは、同時に誰もが使用されます。 – amone

関連する問題