ホームページ  >  記事  >  バックエンド開発  >  Entra ID トークンを使用して SQL Alchemy で Azure SQL データベースに接続する

Entra ID トークンを使用して SQL Alchemy で Azure SQL データベースに接続する

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 18:46:30866ブラウズ

Connect to Azure SQL database in SQL Alchemy using Entra ID tokens

現在、要求中に Azure SQL データベースに接続する必要がある Web アプリケーションがあります。データベースへのクエリを簡単にするために、SQL Alchemy と pyodbc を使用します。

私たちには達成したい目標がいくつかあります:

  • すべてのリクエストは独自のセッションを取得します。リクエストの開始時に新しいセッションを開き、完了したらセッションを閉じる必要があります。
  • Web サービス (Azure Function App または Azure Web App) のマネージド ID を使用してデータベースに接続したいと考えています。
  • セッションと接続の処理をできる限り委任したいと考えています。

セッションの有効期間管理

まず、すべてのリクエストに対して新しいセッションを確実に開くために、リクエスト関数をデコレータにラップして、新しいセッションが作成され、その後破棄されるようにします。

関数呼び出しごとにセッションを渡さずに、アプリケーション全体からセッションに簡単にアクセスできるようにするために、シングルトン パターンを使用します。ただし、複数のリクエストを同時に処理するために複数のスレッドを実行するため、セッション オブジェクトに関して競合状態がないことを確認する必要があります。

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 にはスレッドが完了したかどうかを判断する方法がないため、これを自分で行う必要があります。

マネージド ID を使用して Entra ID トークン経由で接続する

アクセス トークンを使用して 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。