Menyambungkan dan mengkueri Azure SQL Database menggunakan Python dan driver mssql-python

Berlaku untuk:Azure SQL Database

Panduan kilat ini menjelaskan cara menyambungkan aplikasi ke database di Azure SQL Database dan melakukan kueri menggunakan Python dan driver mssql-python. Driver mssql-python memiliki dukungan bawaan untuk autentikasi Microsoft Entra, membuat koneksi tanpa kata sandi menjadi sederhana. Anda dapat mempelajari lebih lanjut tentang koneksi tanpa kata sandi di hub tanpa kata sandi.

Prasyarat

Konfigurasi database

Koneksi aman tanpa kata sandi ke Azure SQL Database memerlukan konfigurasi database tertentu. Verifikasi pengaturan berikut di server logis Anda di Azure untuk menyambungkan dengan benar ke Azure SQL Database di lingkungan lokal dan yang dihosting:

  1. Untuk koneksi pengembangan lokal, pastikan server logis Azure SQL Anda dikonfigurasi untuk memungkinkan alamat IP komputer lokal Anda dan layanan Azure lainnya tersambung:

    1. Di portal Microsoft Azure, di menu sumber daya, di bawah Keamanan, pilih Jaringan.

    2. Pilih tombol Jaringan yang dipilih untuk menampilkan opsi konfigurasi tambahan.

    3. Pilih Tambahkan alamat IPv4 klien Anda(xx.xx.xx.xx) untuk menambahkan aturan firewall yang akan mengaktifkan koneksi dari alamat IPv4 komputer lokal Anda. Atau, Anda juga dapat memilih + Tambahkan aturan firewall untuk memasukkan alamat IP tertentu pilihan Anda.

    4. Pastikan kotak centang Izinkan layanan dan sumber daya Azure untuk mengakses server ini dipilih.

      Cuplikan layar dari portal Microsoft Azure memperlihatkan cara mengonfigurasi aturan firewall server logis Azure SQL.

      Peringatan

      Mengaktifkan pengaturan Izinkan layanan dan sumber daya Azure untuk mengakses server ini bukanlah praktik keamanan yang direkomendasikan untuk skenario produksi. Aplikasi nyata harus menerapkan pendekatan yang lebih aman, seperti pembatasan firewall yang lebih kuat atau konfigurasi jaringan virtual.

      Anda bisa membaca selengkapnya tentang konfigurasi keamanan database pada sumber daya berikut:

  2. Server juga harus mengaktifkan autentikasi Microsoft Entra dan memiliki akun admin Microsoft Entra yang ditetapkan. Untuk koneksi pengembangan lokal, akun admin Microsoft Entra harus menjadi akun yang juga dapat Anda masuk ke Visual Studio atau Azure CLI dengan secara lokal. Anda dapat memverifikasi apakah server Anda mengaktifkan autentikasi Microsoft Entra di halaman ID Microsoft Entra server logis Anda.

    Cuplikan layar memperlihatkan cara mengaktifkan autentikasi Microsoft Entra.

  3. Jika Anda menggunakan akun Azure pribadi, pastikan Anda memiliki penyiapan Microsoft Entra dan dikonfigurasi untuk Azure SQL Database untuk menetapkan akun Anda sebagai admin server. Jika Anda menggunakan akun perusahaan, ID Microsoft Entra kemungkinan besar sudah dikonfigurasi untuk Anda.

Membuat proyek

Buat proyek Python baru menggunakan Visual Studio Code.

  1. Buka Visual Studio Code, buat folder baru untuk proyek Anda, dan ubah ke direktori tersebut.

    mkdir python-sql-azure
    cd python-sql-azure
    
  2. Buat lingkungan virtual untuk aplikasi.

    py -m venv .venv
    .venv\scripts\activate
    
  3. Buat file Python baru yang disebut app.py.

Menginstal driver mssql-python

Untuk menyambungkan ke Azure SQL Database menggunakan Python, instal mssql-python driver. Driver ini memiliki dukungan bawaan untuk autentikasi Microsoft Entra, menghilangkan kebutuhan akan penanganan token manual. Dalam panduan memulai cepat ini, Anda juga menginstal paket fastapi, uvicorn, dan pydantic untuk mengembangkan dan menjalankan API.

Nota

Di macOS dan Linux, dependensi sistem diperlukan sebelum menginstal mssql-python. Lihat Menginstal paket mssql-python untuk instruksi khusus platform.

  1. Buat file requirements.txt dengan baris-baris berikut:

    mssql-python
    fastapi
    uvicorn[standard]
    pydantic
    python-dotenv
    
  2. Instal persyaratan.

    pip install -r requirements.txt
    

Mengonfigurasi string koneksi lokal

Untuk pengembangan lokal, buat .env file di folder proyek Anda untuk menyimpan string koneksi Anda. Ini menjaga kredensial keluar dari kode dan kontrol sumber Anda.

  1. Di folder proyek, buat file baru bernama .env.

  2. Tambahkan variabel AZURE_SQL_CONNECTIONSTRING dengan string koneksi Anda. Ganti tempat penampung <database-server-name> dan <database-name> dengan nilai Anda sendiri.

Driver mssql-python memiliki dukungan bawaan untuk autentikasi Microsoft Entra. Authentication Gunakan parameter untuk menentukan metode autentikasi.

ActiveDirectoryDefault secara otomatis menemukan kredensial dari beberapa sumber tanpa memerlukan masuk interaktif. Ini adalah opsi yang direkomendasikan untuk pengembangan lokal.

Untuk pengalaman pengembangan lokal yang paling andal, masuk dengan Azure CLI terlebih dahulu:

az login

Kemudian gunakan format string koneksi ini dalam file Anda .env :

AZURE_SQL_CONNECTIONSTRING=Server=<database-server-name>.database.windows.net;Database=<database-name>;Authentication=ActiveDirectoryDefault;Encrypt=yes;TrustServerCertificate=no;

ActiveDirectoryDefault mengevaluasi kredensial dalam urutan berikut:

  1. Variabel lingkungan (untuk kredensial perwakilan layanan)
  2. Identitas terkelola (saat berjalan di Azure)
  3. Azure CLI (dari az login)
  4. Visual Studio (khusus Windows)
  5. Azure PowerShell (dari Connect-AzAccount)

Petunjuk / Saran

Untuk aplikasi produksi, gunakan metode autentikasi tertentu untuk skenario Anda untuk menghindari latensi penemuan kredensial:

  • Azure App Service/Functions: Gunakan ActiveDirectoryMSI (identitas terkelola)
  • Login pengguna interaktif: Gunakan ActiveDirectoryInteractive
  • Prinsipal layanan: Gunakan ActiveDirectoryServicePrincipal

Anda bisa mendapatkan detail untuk membuat string koneksi dari portal Azure:

  1. Buka Azure SQL Server, pilih halaman database SQL untuk menemukan nama database Anda, dan pilih database.

  2. Pada database, buka halaman Gambaran Umum untuk mendapatkan nama server.

Menambahkan kode untuk menyambungkan ke Azure SQL Database

Di folder proyek, buat file app.py dan tambahkan kode sampel. Kode ini membuat API yang:

  • Memuat konfigurasi dari berkas .env menggunakan python-dotenv.
  • Mengambil string koneksi Azure SQL Database dari variabel lingkungan.
  • Persons Membuat tabel dalam database selama startup (hanya untuk skenario pengujian).
  • Menentukan fungsi untuk mengambil semua Person rekaman dari database.
  • Menentukan fungsi untuk mengambil satu Person rekaman dari database.
  • Menentukan fungsi untuk menambahkan rekaman baru Person ke database.
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

Peringatan

Kode sampel menunjukkan pernyataan SQL mentah, yang seharusnya tidak digunakan dalam kode produksi. Sebagai gantinya, gunakan paket Object Relational Mapper (ORM) seperti SqlAlchemy yang menghasilkan lapisan objek yang lebih aman untuk mengakses database Anda.

Jalankan dan uji aplikasi secara lokal

Aplikasi ini siap untuk diuji secara lokal.

  1. Jalankan app.py file di Visual Studio Code.

    uvicorn app:app --reload
    
  2. Pada halaman UI Swagger untuk aplikasi http://127.0.0.1:8000/docs, perluas metode POST dan pilih Cobalah.

    Anda juga dapat mencoba /redoc melihat bentuk lain dari dokumentasi yang dihasilkan untuk API.

  3. Ubah contoh JSON untuk menyertakan nilai untuk nama depan dan belakang. Pilih Jalankan untuk menambahkan rekaman baru ke database. API mengembalikan respons yang berhasil.

  4. GET Perluas metode pada halaman antarmuka pengguna Swagger dan pilih Coba. Pilih Jalankan, dan orang yang baru saja Anda buat dikembalikan.

Menyebarkan ke Azure App Service

Aplikasi ini siap disebarkan ke Azure.

  1. Buat file start.sh sehingga gunicorn di Azure App Service dapat menjalankan uvicorn. start.sh memiliki satu baris:

    gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app
    
  2. Gunakan az webapp up untuk menyebarkan kode ke App Service. (Anda dapat menggunakan opsi -dryrun untuk melihat apa yang dilakukan perintah tanpa membuat sumber daya.)

    az webapp up \
        --resource-group <resource-group-name> \
        --name <web-app-name>         
    
  3. Gunakan perintah az webapp config set untuk mengonfigurasi App Service untuk menggunakan file start.sh.

    az webapp config set \
        --resource-group <resource-group-name> \
        --name <web-app-name> \
        --startup-file start.sh
    
  4. Gunakan perintah az webapp identity assign untuk mengaktifkan identitas terkelola yang ditetapkan sistem untuk App Service.

    az webapp identity assign \
        --resource-group <resource-group-name> \
        --name <web-app-name>
    

    Dalam panduan memulai cepat ini, identitas terkelola yang ditetapkan sistem digunakan dalam demonstrasi. Identitas terkelola yang ditetapkan pengguna lebih efisien dalam berbagai skenario yang lebih luas. Untuk informasi selengkapnya, lihat Rekomendasi praktik terbaik identitas terkelola. Untuk contoh penggunaan identitas terkelola yang ditetapkan pengguna dengan mssql-python, lihat Memigrasikan aplikasi Python untuk menggunakan koneksi tanpa kata sandi dengan Azure SQL Database.

Menyambungkan App Service ke Azure SQL Database

Di bagian Konfigurasikan database , Anda mengonfigurasi jaringan dan autentikasi Microsoft Entra untuk server database Azure SQL. Di bagian ini, Anda menyelesaikan konfigurasi database dan mengonfigurasi App Service dengan string koneksi untuk mengakses server database.

Untuk menjalankan perintah ini, Anda dapat menggunakan alat atau IDE apa pun yang dapat tersambung ke Azure SQL Database, termasuk SQL Server Management Studio (SSMS), dan Visual Studio Code dengan ekstensi MSSQL. Anda juga bisa menggunakan portal Microsoft Azure seperti yang dijelaskan di Mulai Cepat: Gunakan editor kueri portal Microsoft Azure untuk mengkueri Azure SQL Database.

  1. Tambahkan pengguna ke Azure SQL Database dengan perintah SQL untuk membuat pengguna dan peran untuk akses tanpa kata sandi.

    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>]
    

    Untuk informasi selengkapnya, lihat Pengguna Database Mandiri - Membuat Database Anda Portabel. Untuk contoh yang menunjukkan prinsip yang sama tetapi diterapkan ke Azure VM, lihat Tutorial: Menggunakan identitas terkelola yang ditetapkan sistem Komputer Virtual Windows untuk mengakses Azure SQL. Untuk informasi selengkapnya tentang peran yang ditetapkan, lihat Peran Tetap-Basis Data.

    Jika Anda menonaktifkan lalu mengaktifkan kembali identitas terkelola yang ditetapkan sistem App Service, hapus pengguna sistem dan buat ulang. Jalankan DROP USER [<web-app-name>] dan ulangi perintah CREATE dan ALTER. Untuk melihat pengguna, gunakan SELECT * FROM sys.database_principals.

  2. Gunakan perintah az webapp config appsettings set untuk menambahkan pengaturan aplikasi untuk string koneksi.

    az webapp config appsettings set \
        --resource-group <resource-group-name> \
        --name <web-app-name> \
        --settings AZURE_SQL_CONNECTIONSTRING="<connection-string>"
    

    Untuk aplikasi yang disebarkan, string koneksi harus menyerupai:

    Server=<database-server-name>.database.windows.net;Database=<database-name>;Authentication=ActiveDirectoryMSI;Encrypt=yes;TrustServerCertificate=no;
    

    Isi <database-server-name> dan <database-name> dengan nilai Anda.

    string koneksi tanpa kata sandi tidak berisi nama pengguna atau kata sandi. Sebagai gantinya, saat aplikasi berjalan di Azure, driver mssql-python menggunakan ActiveDirectoryMSI mode autentikasi untuk mengautentikasi secara otomatis menggunakan identitas terkelola App Service.

Menguji aplikasi yang disebarkan

Telusuri ke URL aplikasi untuk menguji bahwa koneksi ke Azure SQL Database berfungsi. Anda dapat menemukan URL aplikasi Anda di halaman ringkasan App Service.

https://<web-app-name>.azurewebsites.net

Tambahkan /docs ke URL untuk melihat UI Swagger dan uji metode API.

Selamat! Aplikasi Anda sekarang terhubung ke Azure SQL Database di lingkungan lokal dan yang dihosting.