Dela via


Snabbstart: Upprepningsbara distributioner med drivrutinen mssql-python för Python

I den här snabbstarten använder uv du för att hantera projektberoenden och miljöer för Python-skript som ansluter till en databas som du har skapat och läst in med exempeldata. Du använder mssql-python drivrutinen för Python för att ansluta till databasen och utföra grundläggande åtgärder, till exempel att läsa och skriva data.

Drivrutinen mssql-python kräver inga externa beroenden på Windows-datorer. Drivrutinen installerar allt som behövs med en enda pip installation, så att du kan använda den senaste versionen av drivrutinen för nya skript utan att bryta andra skript som du inte har tid att uppgradera och testa.

mssql-python-dokumentation | mssql-python-källkod | Paket (PyPi) | Uv

Förutsättningar


Skapa en SQL-databas

Den här snabbstarten kräver AdventureWorks2022 Lightweight-schemat på Microsoft SQL Server, SQL Database i Fabric eller Azure SQL Database.

Skapa projektet och kör koden

Skapa ett nytt projekt

  1. Öppna en kommandotolk i utvecklingskatalogen. Om du inte har en, skapar du en ny katalog med namnet python, scriptsosv. Undvik mappar på Din OneDrive kan synkroniseringen störa hanteringen av din virtuella miljö.

  2. Skapa ett nytt projekt med uv.

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

Lägga till beroenden

Installera paketen mssql-python, python-dotenvoch rich i samma katalog.

uv add mssql-python python-dotenv rich

Öppna Visual Studio Code

Kör följande kommando i samma katalog.

code .

Uppdatera pyproject.toml

  1. pyproject.toml innehåller metadata för projektet. Öppna filen i din favoritredigerare.

  2. Granska innehållet i filen. Det bör likna det här exemplet. Observera Python-versionen och beroendet där mssql-python använder >= för att definiera en lägsta version. Om du föredrar en exakt version, ändra >= före versionsnumret till ==. De lösta versionerna av varje paket lagras sedan i uv.lock. Låsfilen säkerställer att utvecklare som arbetar med projektet använder konsekventa paketversioner. Det säkerställer också att exakt samma uppsättning paketversioner används när du distribuerar paketet till slutanvändare. Du bör inte redigera uv.lock filen.

    [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>=0.10.0",
        "python-dotenv>=1.1.1",
        "rich>=14.1.0",
    ]
    
  3. Uppdatera beskrivningen så att den blir mer beskrivande.

    description = "Connects to a SQL database using mssql-python"
    
  4. Spara och stäng filen.

Uppdatera main.py

  1. Öppna filen med namnet main.py. Det bör likna det här exemplet.

    def main():
        print("Hello from mssql-python-repeatable-qs!")
    
    if __name__ == "__main__":
        main()
    
  2. Överst i filen lägger du till följande importer ovanför raden med def main().

    Tips/Råd

    Om Visual Studio Code har problem med att lösa paket måste du uppdatera tolken så att den använder den virtuella miljön.

    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. Mellan importerna och raden med def main()lägger du till följande kod.

    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. Mellan importerna och def get_results(sleep_time: int = 0) -> None:lägger du till den här koden.

    _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. Hitta den här koden.

    def main():
        print("Hello from test!")
    
  6. Ersätt den med den här koden.

    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. Spara och stäng main.py.

Spara anslutningssträngen

  1. .gitignore Öppna filen och lägg till ett undantag för .env filer. Filen bör likna det här exemplet. Se till att spara och stänga den när du är klar.

    # Python-generated files
    __pycache__/
    *.py[oc]
    build/
    dist/
    wheels/
    *.egg-info
    
    # Virtual environments
    .venv
    
    # Connection strings and secrets
    .env
    
  2. I den aktuella katalogen skapar du en ny fil med namnet .env.

  3. I .env-filen lägger du till en post för din anslutningssträng med namnet SQL_CONNECTION_STRING. Ersätt exemplet här med det faktiska anslutningssträngsvärdet.

    SQL_CONNECTION_STRING="Server=<server_name>;Database={<database_name>};Encrypt=yes;TrustServerCertificate=no;Authentication=ActiveDirectoryInteractive"
    

    Tips/Råd

    Anslutningssträngen som används här beror till stor del på vilken typ av SQL-databas du ansluter till. Om du ansluter till en Azure SQL Database eller en SQL-databas i Fabric använder du ODBC-anslutningssträngen från fliken Anslutningssträngar. Du kan behöva justera autentiseringstypen beroende på ditt scenario. Mer information om anslutningssträngar och deras syntax finns i referens för anslutningssträngssyntax.

Använd uv run för att köra skriptet

Tips/Råd

Om du vill använda Microsoft Entra-autentisering i macOS måste du vara inloggad via antingen Azure Repos-tillägget i Visual Studio Code eller genom att köra az login via Azure Command-Line Interface (CLI).

  1. Kör följande kommando i terminalfönstret från tidigare eller ett nytt terminalfönster som är öppet till samma katalog.

     uv run main.py
    
  2. Nu ska vi köra den igen men långsammare för att kunna se båda statusuppdateringarna.

     uv run main.py --sleep-time 5
    

    Här är de förväntade utdata när skriptet är klart.

                             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. Om du vill distribuera skriptet till en annan dator kopierar du alla filer förutom .venv mappen till den andra datorn. Den virtuella miljön återskapas med den första körningen.

Nästa steg

mssql-python Besök GitHub-drivrutinslagringsplatsen för drivrutiner för fler exempel för att bidra med idéer eller rapportera problem.