Mulai cepat: Penyebaran berulang dengan driver mssql-python untuk Python

Dalam panduan mulai cepat ini, Anda menggunakan uv untuk mengelola dependensi proyek dan lingkungan bagi skrip Python yang terhubung ke basis data yang Anda buat dan isi dengan data sampel. Anda menggunakan mssql-python driver Python untuk terhubung ke database Anda dan melakukan operasi dasar, seperti membaca dan menulis data.

Driver mssql-python tidak memerlukan dependensi eksternal apa pun pada komputer Windows. Driver menginstal semua yang dibutuhkan dengan satu pip instalasi, memungkinkan Anda menggunakan versi terbaru driver untuk skrip baru tanpa merusak skrip lain yang belum sempat Anda tingkatkan dan uji.

dokumentasi mssql-pythonkode sumber mssql-pythonPaket (PyPI)uv

Prasyarat

Instal prasyarat sistem operasi

Instal prasyarat khusus sistem operasi satu kali. Pengguna Windows dapat melewati langkah ini. Untuk detail platform lengkap, lihat Menginstal mssql-python.

apk add libtool krb5-libs krb5-dev libstdc++

Membuat database SQL

Buat atau sambungkan ke database SQL di salah satu platform berikut:

Membuat proyek dan menjalankan kode

Membuat proyek baru

  1. Buka jendela perintah di direktori pengembangan Anda. Jika Anda tidak memilikinya, buat direktori baru, seperti python atau scripts. Hindari folder di OneDrive Anda, karena sinkronisasi dapat mengganggu pengelolaan lingkungan virtual Anda.

  2. Buat proyek baru dengan uv.

    uv init mssql-python-repeatable-qs
    cd mssql-python-repeatable-qs
    

Menambahkan dependensi

Di direktori yang sama, instal paket mssql-python, python-dotenv, dan rich.

uv add mssql-python python-dotenv rich

Luncurkan Visual Studio Code

Di direktori yang sama, jalankan perintah berikut.

code .

Memperbarui pyproject.toml

  1. pyproject.toml Buka file di editor Anda. File ini berisi metadata untuk proyek Anda.

  2. Tinjau isi dari file tersebut. Ini harus mirip dengan contoh ini. Perhatikan versi Python dan dependensi; untuk mssql-python, gunakan >= guna menentukan versi minimum. Jika Anda lebih suka versi yang tepat, ubah >= sebelum nomor versi menjadi ==. Versi yang diselesaikan dari setiap paket disimpan di uv.lock. Lockfile memastikan bahwa pengembang yang mengerjakan proyek menggunakan versi paket yang konsisten. Ini juga memastikan bahwa set versi paket yang sama persis digunakan saat mendistribusikan paket Anda kepada pengguna akhir. Komitkan pyproject.toml dan uv.lock, tinjau perubahan pada berkas lockfile dalam pull request, dan jalankan pemindai dependensi yang disetujui organisasi di CI. Jangan mengedit uv.lock file secara langsung.

    [project]
    name = "mssql-python-repeatable-qs"
    version = "0.1.0"
    description = "Add your description here"
    readme = "README.md"
    requires-python = ">=3.11"
    dependencies = [
        "mssql-python>=1.16.0",
        "python-dotenv>=1.1.1",
        "rich>=14.1.0",
    ]
    
  3. Perbarui description nilainya.

    description = "Connects to a SQL database using mssql-python"
    
  4. Simpan dan tutup file.

Memperbarui main.py

  1. Buka file bernama main.py. Ini harus mirip dengan contoh ini.

    def main():
        print("Hello from mssql-python-repeatable-qs!")
    
    if __name__ == "__main__":
        main()
    
  2. Di bagian atas file, tambahkan pernyataan impor berikut sebelum baris yang berisi def main().

    Tip

    Jika Visual Studio Code mengalami masalah dalam menyelesaikan paket, Anda perlu memperbarui penerjemah untuk menggunakan lingkungan virtual.

    from os import getenv
    from dotenv import load_dotenv
    from mssql_python import connect, Connection, Cursor
    from rich.console import Console
    from rich.progress import Progress, SpinnerColumn, TextColumn
    from rich.table import Table
    from argparse import ArgumentParser
    from time import sleep
    
  3. Antara impor dan baris dengan def main(), tambahkan kode berikut.

    def get_results(sleep_time: int = 0) -> None:
        with Progress(
            SpinnerColumn(),
            TextColumn("[progress.description]{task.description}"),
            transient=True,
        ) as progress:
            task = progress.add_task(description="Connecting to SQL...")
    
            cursor = query_sql()
    
            # Simulate a slow connection for demo purposes
            sleep(sleep_time)
    
            progress.update(task, description="Formatting results...")
    
            table = Table(title="Orders by Customer")
            # https://rich.readthedocs.io/en/stable/appendix/colors.html
            table.add_column("Customer ID", style="bright_blue", justify="center")
            table.add_column("Company Name", style="bright_white", justify="left")
            table.add_column("Order Count", style="bold green", justify="right")
    
            records = cursor.fetchall()
            for r in records:
                table.add_row(f"{r.CustomerID}", f"{r.CompanyName}", f"{r.OrderCount}")
    
            if cursor:
                cursor.close()
    
            # Simulate a slow connection for demo purposes
            sleep(sleep_time)
    
            progress.stop()
    
            Console().print(table)
    
  4. Antara impor dan def get_results(sleep_time: int = 0) -> None:, tambahkan kode ini.

    _connection = None
    
    def get_connection() -> Connection:
        global _connection
        if not _connection:
            load_dotenv()
            _connection = connect(getenv("SQL_CONNECTION_STRING"))  # type: ignore
        return _connection
    
    def query_sql() -> Cursor:
        SQL_QUERY = """
        SELECT TOP 5
            c.CustomerID,
            c.CompanyName,
            COUNT(soh.SalesOrderID) AS OrderCount
        FROM SalesLT.Customer AS c
        LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh
            ON c.CustomerID = soh.CustomerID
        GROUP BY
            c.CustomerID,
            c.CompanyName
        ORDER BY OrderCount DESC;
        """
    
        conn = get_connection()
        cursor = conn.cursor()
        cursor.execute(SQL_QUERY)
        return cursor
    
  5. Temukan kode ini.

    def main():
        print("Hello from mssql-python-repeatable-qs!")
    
  6. Ganti dengan kode ini.

    def main() -> None:
        parser = ArgumentParser()
        parser.add_argument("--sleep-time", type=int, default=0,
                            help="Time to sleep in seconds to simulate slow connection")
        args = parser.parse_args()
    
        if args.sleep_time > 0:
            get_results(args.sleep_time)
        else:
            get_results()
    
        if _connection:
            _connection.close()
    
  7. Simpan dan tutup main.py.

Simpan string koneksi

  1. .gitignore Buka file dan tambahkan pengecualian untuk .env file. File Anda harus mirip dengan contoh berikut.

    # Python-generated files
    __pycache__/
    *.py[oc]
    build/
    dist/
    wheels/
    *.egg-info
    
    # Virtual environments
    .venv
    
    # Connection strings and secrets
    .env
    
  2. Simpan dan tutup .gitignore.

  3. Di direktori saat ini, buat file baru bernama .env.

  4. Di dalam file .env, tambahkan entri untuk string koneksi Anda yang bernama SQL_CONNECTION_STRING. Ganti "placeholder" dengan nilai aktual Anda.

    SQL_CONNECTION_STRING="Server=<server>;Database=<database>;Encrypt=yes;TrustServerCertificate=no;Authentication=ActiveDirectoryInteractive"
    

    Penting

    Jaga .env lokal dan di luar kendali sumber. Untuk CI dan lingkungan yang disebarkan, injeksikan string koneksi atau rahasia komponennya dari penyimpanan rahasia platform Anda alih-alih menyalin .env antar mesin.

    string koneksi tergantung pada jenis database SQL yang Anda sambungkan ke. Untuk Azure SQL Database atau database SQL di Fabric, gunakan ODBC string koneksi dari tab string koneksis, dan sesuaikan tipe autentikasi untuk skenario Anda. Untuk informasi lebih lanjut tentang sintaks string koneksi, lihat Connection strings untuk mssql-python.

    Tip

    Di macOS, baik ActiveDirectoryInteractive dan ActiveDirectoryDefault berfungsi untuk autentikasi Microsoft Entra. ActiveDirectoryInteractive meminta Anda untuk masuk setiap kali Anda menjalankan skrip. Untuk menghindari permintaan masuk berulang, masuk sekali dengan perintah Azure CLIaz login, lalu gunakan ActiveDirectoryDefault. ActiveDirectoryDefault menggunakan kembali kredensial yang tersimpan di cache.

Menggunakan uv run untuk menjalankan skrip

  1. Di jendela terminal dari sebelumnya, atau jendela terminal baru terbuka ke direktori yang sama, jalankan perintah berikut.

    uv run main.py
    
  2. Jalankan skrip lagi dengan penundaan agar Anda dapat melihat kedua pembaruan status.

    uv run main.py --sleep-time 5
    

    Berikut adalah output yang diharapkan saat skrip selesai.

                             Orders by Customer
    ┏━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
    ┃ Customer ID ┃ Company Name                   ┃ Order Count ┃
    ┡━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
    │    29485    │ Professional Sales and Service │           1 │
    │    29531    │ Remarkable Bike Store          │           1 │
    │    29546    │ Bulk Discount Store            │           1 │
    │    29568    │ Coalition Bike Company         │           1 │
    │    29584    │ Futuristic Bikes               │           1 │
    └─────────────┴────────────────────────────────┴─────────────┘
    
  3. Untuk menyebarkan skrip Anda ke komputer lain, salin file proyek, termasuk pyproject.toml dan uv.lock, tetapi bukan .venv folder atau file lokal .env apa pun. Buat ulang lingkungan virtual pada eksekusi pertama dan sediakan rahasia melalui lingkungan target.