適用於:Azure SQL 資料庫
此快速入門說明如何將應用程式連接到 Azure SQL 資料庫中的資料庫,並使用 Python 及 mssql-python 驅動程式執行查詢。 mssql-python 驅動程式內建支援 Microsoft Entra 認證,使無密碼連線變得簡單。 您可以在無密碼中樞上深入了解無密碼連線。
必要條件
- Azure 訂用帳戶。
- 帶 Microsoft Entra 驗證的 Azure SQL 資料庫。 您可以使用 快速入門:建立單一資料庫 - Azure SQL Database 來建立一個資料庫。 或者,你也可以在 Microsoft Fabric 中使用 SQL 資料庫。
- 帶 Python 延伸模組的 Visual Studio Code。
- Python 3.10 以上版本。
- Azure CLI 用於無密碼認證(可在 Windows、macOS 和 Linux 上使用)。
設定 資料庫
Azure SQL 資料庫的安全無密碼連線需要特定資料庫設定。 確認 Azure 中邏輯伺服器上的下列設定,以在本機和託管環境中正確連線到 Azure SQL 資料庫:
針對本機開發連線,請確定您的邏輯伺服器已設定為允許本機電腦 IP 位址及其他 Azure 服務連線:
瀏覽至伺服器的 [網路] 頁面。
切換 [選取的網路]單選按鈕以顯示更多設定選項。
選取 [新增用戶端 IPv4 位址 (xx.xx.xx.xx)],以新增防火牆規則,啟用來自本機電腦 IPv4 位址的連線。 或者您也可以選取 [+ 新增防火牆規則] 來輸入您選擇的特定 IP 位址。
確定選取 [允許 Azure 服務和資源存取此伺服器] 核取方塊。
警告
對於實際執行場景,出於安全考量,不建議啟用 [允許 Azure 服務和資源存取此伺服器] 設定。 實際應用程式應該實作更安全的方法,例如更強大的防火牆限制或虛擬網路設定。
可以存取下列資源,深入了解資料庫安全設定:
伺服器也必須啟用 Microsoft Entra 驗證,並已指派 Microsoft Entra 管理帳戶。 針對本機開發連線,Microsoft Entra 管理員帳戶應該也是您可以用來本機登入 Visual Studio 或 Microsoft Azure CLI 的帳戶。 您可以在邏輯伺服器的 [Microsoft Entra ID] 頁面確認伺服器是否已啟用 Microsoft Entra 驗證。
如果您使用個人 Azure 帳戶,請確定您已針對 Azure SQL 資料庫設定 Microsoft Entra,將您的帳戶指派為伺服器管理員。如果您使用公司帳戶,很可能已為您設定好 Microsoft Entra ID。
建立專案
使用 Visual Studio Code 建立新的 Python 專案。
打開 Visual Studio Code,為你的專案建立一個新資料夾,然後切換到那個目錄。
mkdir python-sql-azure cd python-sql-azure建立應用程式的虛擬環境。
py -m venv .venv .venv\scripts\activate建立名為
app.py的新 Python 檔案。
安裝 mssql-python 驅動程式
若要使用 Python 連線到 Azure SQL 資料庫,請安裝 mssql-python 驅動程式。 此驅動內建支援 Microsoft Entra 認證,免除手動令牌處理的需求。 在本快速入門中,您也會安裝 fastapi、 uvicorn和 pydantic 套件,以建立和執行 API。
備註
在 macOS 和 Linux 上,安裝 mssql-python前必須有系統相依性。 請參閱 安裝 mssql-python 套件 以獲取平台專屬的指示。
建立包含以下行的 requirements.txt 檔案:
mssql-python fastapi uvicorn[standard] pydantic python-dotenv安裝必要組件。
pip install -r requirements.txt
設定本機連接字串
在本地開發時,可以在專案資料夾裡建立 .env 一個檔案來儲存你的連接字串。 這樣可以避免憑證進入你的程式碼和原始碼控制。
在專案資料夾中,建立一個名為
.env. 的新檔案。將
AZURE_SQL_CONNECTIONSTRING變數新增至您的連接字串。 將<database-server-name>和<database-name>預留位置替換為您自己的值。
mssql-python 驅動程式內建支援 Microsoft Entra 認證。 使用參數 Authentication 來指定認證方法。
ActiveDirectoryDefault 自動從多個來源發現憑證,無需互動式登入。 這是 當地開發的推薦選項。
為了獲得最可靠的本地開發體驗,請先用 Azure CLI 登入:
az login
然後在你的 .env 檔案中使用這個連接字串格式:
AZURE_SQL_CONNECTIONSTRING=Server=<database-server-name>.database.windows.net;Database=<database-name>;Authentication=ActiveDirectoryDefault;Encrypt=yes;TrustServerCertificate=no;
ActiveDirectoryDefault 依照以下順序評估資格:
- 環境變數 (用於服務主體憑證)
- 管理身份 (在 Azure 上執行時)
-
Azure CLI (from
az login) - Visual Studio (僅限 Windows)
-
Azure PowerShell (from
Connect-AzAccount)
小提示
對於生產環境應用,請使用針對你情境的特定認證方法,以避免憑證發現延遲:
-
Azure App Service/Functions:使用
ActiveDirectoryMSI(受管理的身份) -
互動式使用者登入:使用
ActiveDirectoryInteractive -
服務主體:使用
ActiveDirectoryServicePrincipal
您可以從 Azure 入口網站取得建立連接字串的詳細資訊:
移至 Azure SQL Server,選取 [SQL Database] 頁面以找到資料庫名稱,然後選取資料庫。
在資料庫中,前往 「概覽 」頁面取得伺服器名稱。
新增程式碼以連線至 Azure SQL 資料庫
在專案資料夾中,建立 app.py 檔案並新增範例程式碼。 此程式碼會建立一個 API,以:
- 從
.env檔案載入設定,使用python-dotenv。 - 從環境變數擷取 Azure SQL 資料庫連接字串。
- 啟動期間在資料庫中建立
Persons資料表 (僅限測試場景)。 - 定義從資料庫擷取全部
Person記錄的函數。 - 定義從資料庫擷取一條
Person記錄的函數。 - 定義函數以將新
Person記錄新增至資料庫。
from os import getenv
from typing import Union
from dotenv import load_dotenv
from fastapi import FastAPI
from pydantic import BaseModel
from mssql_python import connect
load_dotenv()
class Person(BaseModel):
first_name: str
last_name: Union[str, None] = None
connection_string = getenv("AZURE_SQL_CONNECTIONSTRING")
app = FastAPI()
@app.get("/")
def root():
print("Root of Person API")
try:
conn = get_conn()
cursor = conn.cursor()
# Table should be created ahead of time in production app.
cursor.execute("""
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Persons')
CREATE TABLE Persons (
ID int NOT NULL PRIMARY KEY IDENTITY,
FirstName varchar(255),
LastName varchar(255)
);
""")
conn.commit()
conn.close()
except Exception as e:
# Table might already exist
print(e)
return "Person API"
@app.get("/all")
def get_persons():
rows = []
with get_conn() as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM Persons")
for row in cursor.fetchall():
print(row.FirstName, row.LastName)
rows.append(f"{row.ID}, {row.FirstName}, {row.LastName}")
return rows
@app.get("/person/{person_id}")
def get_person(person_id: int):
with get_conn() as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM Persons WHERE ID = ?", (person_id,))
row = cursor.fetchone()
return f"{row.ID}, {row.FirstName}, {row.LastName}"
@app.post("/person")
def create_person(item: Person):
with get_conn() as conn:
cursor = conn.cursor()
cursor.execute("INSERT INTO Persons (FirstName, LastName) VALUES (?, ?)",
(item.first_name, item.last_name))
conn.commit()
return item
def get_conn():
"""Connect using mssql-python with built-in Microsoft Entra authentication."""
conn = connect(connection_string)
conn.setautocommit(True)
return conn
警告
範例程式碼顯示原始 SQL 陳述式,不應用於實際執行程式碼。 請改用物件關聯式對應 (ORM) 套件,例如 SqlAlchemy,以產生更安全的物件層來存取資料庫。
在本機執行和測試應用程式
應用程式已準備好在本機進行測試。
在 Visual Studio Code 中執行
app.py檔案。uvicorn app:app --reload在應用程式
http://127.0.0.1:8000/docs的 Swagger UI 頁面上,展開 POST 方法,然後選取 [試用]。你也可以嘗試
/redoc查看 API 產生的其他文件形式。修改範例 JSON 以包含名字和姓氏的值。 選取 [執行] 以將新記錄新增至資料庫。 API 會傳回成功的回應。
在 Swagger UI 頁面上展開
GET方法,然後選擇 [試用]。 選取 [執行],您剛才建立的人物將被傳回。
部署到 Azure App Service
如此應用程式即已就緒,可開始部署至 Azure。
建立 start.sh 檔案,以便 Azure App Service 中的 gunicorn 可以執行 uvicorn。 start.sh 有一行:
gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app使用 az webapp up 將程式碼部署至 App Service。 (可以使用
-dryrun選項來查看命令的用途,而不建立資源。)az webapp up \ --resource-group <resource-group-name> \ --name <web-app-name>使用 az webapp config set 命令來設定 App Service 以使用 start.sh 檔案。
az webapp config set \ --resource-group <resource-group-name> \ --name <web-app-name> \ --startup-file start.sh使用 az webapp identity assign 命令為 App Service 啟用系統指派的受控識別。
az webapp identity assign \ --resource-group <resource-group-name> \ --name <web-app-name>在此快速入門中,系統指派的管理身份用於示範。 在更廣泛的案例中,使用者指派的受控識別效率更高。 如需詳細資訊,請參閱受控識別最佳做法建議。 關於使用 mssql-python 使用使用者指派管理身份的範例,請參見 「遷移 Python 應用程式以使用 Azure SQL 資料庫的無密碼連線」。
將 App Service 連線到 Azure SQL 資料庫
在 [設定資料庫] 區段中,您已為 Azure SQL 資料庫伺服器設定網路和 Microsoft Entra 驗證。 在本節中,您將完成資料庫設定,並使用連接字串設定 App Service 以存取資料庫伺服器。
若要執行這些命令,您可以使用任何可連線到 Azure SQL 資料庫的工具或 IDE,包括 SQL Server Management Studio (SSMS) 和具有 MSSQL 延伸模組的 Visual Studio Code。 您也可以使用 Azure 入口網站,如 快速入門:使用 Azure 入口網站查詢編輯器查詢 Azure SQL 資料庫中所述。
使用 SQL 命令將使用者新增至 Azure SQL 資料庫,以建立用於無密碼存取的使用者和角色。
CREATE USER [<web-app-name>] FROM EXTERNAL PROVIDER ALTER ROLE db_datareader ADD MEMBER [<web-app-name>] ALTER ROLE db_datawriter ADD MEMBER [<web-app-name>]如需詳細資訊,請參閱 獨立資料庫使用者 - 提升資料庫的可攜性。 如需顯示相同原則但套用至 Azure VM 的範例,請參閱教學課程:使用 Windows VM 系統指派的受控識別來存取 Azure SQL。 如需指派的角色的詳細資訊,請參閱固定資料庫角色。
如果先停用再啟用 App Service 系統指派的受控識別,則刪除使用者並重新建立。 執行
DROP USER [<web-app-name>],然後重新執行CREATE和ALTER命令。 若要檢視使用者,請使用SELECT * FROM sys.database_principals。使用 az webapp config appsettings set 命令來新增連接字串的應用程式設定。
az webapp config appsettings set \ --resource-group <resource-group-name> \ --name <web-app-name> \ --settings AZURE_SQL_CONNECTIONSTRING="<connection-string>"對於已部署的應用程式,連接字串應類似於:
Server=<database-server-name>.database.windows.net;Database=<database-name>;Authentication=ActiveDirectoryMSI;Encrypt=yes;TrustServerCertificate=no;在
<database-server-name>和<database-name>中填入您的值。無密碼連接字串不包含使用者名稱或密碼。 相反地,當應用程式在 Azure 執行時,mssql-python 驅動程式會使用
ActiveDirectoryMSI認證模式自動使用應用程式服務的管理身份來驗證。
測試已部署的應用程式
瀏覽至應用程式的 URL,以測試與 Azure SQL 資料庫間的連線是否正常運作。 您可以在 App Service 概觀頁面上找到您應用程式的 URL。
https://<web-app-name>.azurewebsites.net
附加 /docs 至 URL 以查看 Swagger UI 並測試 API 方法。
恭喜! 您的應用程式現在已與本機和託管環境中的 Azure SQL 資料庫建立連線。