現在、要求中に Azure SQL データベースに接続する必要がある Web アプリケーションがあります。データベースへのクエリを簡単にするために、SQL Alchemy と pyodbc を使用します。
私たちには達成したい目標がいくつかあります:
まず、すべてのリクエストに対して新しいセッションを確実に開くために、リクエスト関数をデコレータにラップして、新しいセッションが作成され、その後破棄されるようにします。
関数呼び出しごとにセッションを渡さずに、アプリケーション全体からセッションに簡単にアクセスできるようにするために、シングルトン パターンを使用します。ただし、複数のリクエストを同時に処理するために複数のスレッドを実行するため、セッション オブジェクトに関して競合状態がないことを確認する必要があります。
SQL Alchemy には、これを簡単にする優れたユーティリティ、スコープ付きセッションがあります。
これを使用するには、接続ファクトリをscoped_session()呼び出しにラップします。
from urllib.parse import quote_plus from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session connection_string = "..." engine = create_engine("mssql+pyodbc:///?odbc_connect={}".format(quote_plus(connection_string)) session_factory = sessionmaker(bind=engine) Session = scoped_session(session_factory)
これで、セッションを使用したいときはいつでも、Session() を呼び出すだけで、SQL Alchemy が既存のセッション オブジェクトを確実に再利用します。完了したら、Session.remove() を呼び出してセッションを閉じることができます。 SQL Alchemy にはスレッドが完了したかどうかを判断する方法がないため、これを自分で行う必要があります。
アクセス トークンを使用して Azure SQL データベースへの接続をセットアップする方法を説明した投稿がいくつかありますが、これに最適なリソースは SQL Alchemy ドキュメント自体です。
一緒に詳細を見ていきましょう。まず、接続文字列が必要です。マネージド ID (またはローカル開発の場合は Azure CLI) に依存したいため、接続文字列には資格情報を含めません:
Driver={ODBC Driver 18 for SQL Server};Database=YOUR_DB;Server=tcp:you.database.windows.net,1433;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30
私たちの一般的な計画は次のとおりです:
それでは、コードを見てみましょう:
from urllib.parse import quote_plus from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session connection_string = "..." engine = create_engine("mssql+pyodbc:///?odbc_connect={}".format(quote_plus(connection_string)) session_factory = sessionmaker(bind=engine) Session = scoped_session(session_factory)
これで目標を達成しました。 scoped_session() を使用すると、リクエストが届くたびに新しいセッションを開く必要はありません (これは自動的に処理されます)。しかし、あまりにも多くのダングリングセッションが発生しないように、最後にセッションを閉じる必要があります。
また、独自の ID (ローカル開発用) または Web サービスのマネージド ID を使用して SQL データベースに接続します。新しい接続が作成されるたびに、接続文字列を変更します。
スコープセッションの概念を理解するのを手伝ってくれた David に感謝します。
以上がEntra ID トークンを使用して SQL Alchemy で Azure SQL データベースに接続するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。