我們有一個正在運行的 Web 應用程序,需要在請求期間連接到我們的 Azure SQL 資料庫。為了讓查詢資料庫更容易,我們使用 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 文件本身。
讓我們一起看一下細節。首先,我們需要一個連接字串。由於我們希望依賴託管身分(或 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中文網其他相關文章!