首頁  >  文章  >  後端開發  >  使用 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

我們有一個正在運行的 Web 應用程序,需要在請求期間連接到我們的 Azure SQL 資料庫。為了讓查詢資料庫更容易,我們使用 SQL Alchemy 和 pyodbc。

我們有一些想要實現的目標:

  • 每個請求都有自己的會話。我們希望在請求開始時打開一個新會話,並在請求完成後關閉它。
  • 我們希望使用 Web 服務(Azure Function App 或 Azure Web App)的託管識別碼連接到資料庫。
  • 我們希望盡可能委託處理會話和連接。

會話生命週期管理

首先,為了確保我們為每個請求打開一個新會話,我們可以將請求函數包裝到裝飾器中,以確保創建並隨後銷毀新會話。

為了確保我們的會話可以從整個應用程式輕鬆訪問,而不必在每個函數呼叫中移交它,我們使用單例模式。但是,由於我們執行多個執行緒來同時處理多個請求,因此我們必須確保會話物件不存在競爭條件。

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 無法判斷執行緒是否已完成,因此我們必須自行執行此操作。

使用託管身分透過 Entra ID 令牌進行連接

有一些文章描述如何使用存取權杖設定與 Azure SQL 資料庫的連接,但最好的資源是 SQL Alchemy 文件本身。

讓我們一起看一下細節。首先,我們需要一個連接字串。由於我們希望依賴託管身分(或 Azure CLI 進行本機開發),因此我們不會將任何憑證放入連接字串中:

驅動程式={ODBC Driver 18 for SQL Server};資料庫=YOUR_DB;伺服器=tcp:you.database.windows.net,1433;加密=是;TrustServerCertificate=no;連線逾時=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(),我們不需要每次收到請求時都開啟一個新會話(這將為我們處理),但我們應該在最後關閉會話,這樣我們就不會有太多懸空會話。

我們也使用我們自己的身分(對於本機開發人員)或 Web 服務的託管身分連接到 SQL 資料庫。每次建立新連接時,我們都會修改連接字串。

致謝

非常感謝 David 幫我弄清楚範圍會話的概念。

以上是使用 Entra ID 令牌連接到 SQL Alchemy 中的 Azure SQL 資料庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn