Share via


Python ve pyodbc sürücüsünü kullanarak Azure SQL Veritabanı Bağlan ve sorgulama

Şunlar için geçerlidir:Azure SQL Veritabanı

Bu hızlı başlangıçta, bir uygulamanın Azure SQL Veritabanı'daki bir veritabanına nasıl bağlandığı ve Python ve Python SQL Sürücüsü - pyodbc kullanarak sorgular nasıl gerçekleştirebileceğiniz açıklanır. Bu hızlı başlangıç, veritabanına bağlanmak için önerilen parolasız yaklaşımı izler. Parolasız bağlantılar hakkında daha fazla bilgiyi parolasız hub'dan öğrenebilirsiniz.

Önkoşullar

  • Bir Azure aboneliği.
  • Microsoft Entra kimlik doğrulaması ile yapılandırılmış bir Azure SQL veritabanı. Veritabanı oluştur hızlı başlangıcını kullanarak bir tane oluşturabilirsiniz.
  • Azure CLI'nın en son sürümü.
  • Python uzantısıyla Visual Studio Code.
  • Python 3.8 veya üzeri. Linux istemci makinesi kullanıyorsanız bkz . ODBC sürücüsünü yükleme.

Veritabanını yapılandırma

Azure SQL Veritabanı için güvenli, parolasız bağlantılar için belirli veritabanı yapılandırmaları gerekir. Hem yerel hem de barındırılan ortamlardaki Azure SQL Veritabanı düzgün bir şekilde bağlanmak için Azure'daki mantıksal sunucunuzda aşağıdaki ayarları doğrulayın:

  1. Yerel geliştirme bağlantıları için mantıksal sunucunuzun yerel makine IP adresinizin ve diğer Azure hizmetlerinin bağlanmasına izin verecek şekilde yapılandırıldığından emin olun:

    • Sunucunuzun Ağ sayfasına gidin.

    • Ek yapılandırma seçeneklerini göstermek için Seçili ağlar radyo düğmesini değiştirin.

    • Yerel makinenizin IPv4 adresinden bağlantıları etkinleştirecek bir güvenlik duvarı kuralı eklemek için İstemci IPv4 adresinizi (xx.xx.xx.xx) ekle'yi seçin. Alternatif olarak, istediğiniz belirli bir IP adresini girmek için + Güvenlik duvarı kuralı ekle'yi de seçebilirsiniz.

    • Azure hizmetlerinin ve kaynaklarının bu sunucuya erişmesine izin ver onay kutusunun seçili olduğundan emin olun.

      Güvenlik duvarı kurallarını yapılandırmayı gösteren ekran görüntüsü.

      Uyarı

      Azure hizmetlerinin ve kaynaklarının bu sunucuya erişmesine izin ver ayarını etkinleştirmek, üretim senaryoları için önerilen bir güvenlik uygulaması değildir. Gerçek uygulamalar daha güçlü güvenlik duvarı kısıtlamaları veya sanal ağ yapılandırmaları gibi daha güvenli yaklaşımlar uygulamalıdır.

      Aşağıdaki kaynaklarda veritabanı güvenlik yapılandırmaları hakkında daha fazla bilgi edinebilirsiniz:

  2. Sunucuda ayrıca Microsoft Entra kimlik doğrulaması etkinleştirilmiş ve atanmış bir Microsoft Entra yönetici hesabı olmalıdır. Yerel geliştirme bağlantıları için, Microsoft Entra yönetici hesabı yerel olarak Visual Studio'da veya Azure CLI'da oturum açabileceğiniz bir hesap olmalıdır. Mantıksal sunucunuzun Microsoft Entra Id sayfasında sunucunuzda Microsoft Entra kimlik doğrulamasının etkinleştirilip etkinleştirilmediğini doğrulayabilirsiniz.

    Microsoft Entra kimlik doğrulamasını etkinleştirmeyi gösteren ekran görüntüsü.

  3. Kişisel bir Azure hesabı kullanıyorsanız hesabınızı sunucu yöneticisi olarak atamak için Microsoft Entra kurulumunu yaptığınızdan ve Azure SQL Veritabanı için yapılandırdığınızdan emin olun. Şirket hesabı kullanıyorsanız, Microsoft Entra Id büyük olasılıkla sizin için zaten yapılandırılmış olacaktır.

Proje oluşturma

Visual Studio Code kullanarak yeni bir Python projesi oluşturun.

  1. Visual Studio Code'u açın ve projeniz için yeni bir klasör oluşturun ve dizini bu klasöre değiştirin.

    mkdir python-sql-azure
    cd python-sql-azure
    
  2. Uygulama için bir sanal ortam oluşturun.

    py -m venv .venv
    .venv\scripts\activate
    
  3. adlı app.pyyeni bir Python dosyası oluşturun.

pyodbc sürücüsünü yükleme

Python kullanarak Azure SQL Veritabanı bağlanmak için sürücüyü yükleyinpyodbc. Bu paket veritabanlarına bağlanmak, komutları yürütmek ve sonuçları almak için bir veri sağlayıcısı işlevi görür. Bu hızlı başlangıçta, api oluşturmak ve çalıştırmak için , uvicornve pydantic paketlerini de yüklersinizflask.

Sürücüyü tüm işletim sistemlerine pyodbc yüklemeye ilişkin ayrıntılar ve belirli yönergeler için bkz . Pyodbc Python geliştirmesi için geliştirme ortamını yapılandırma.

  1. Aşağıdaki satırlarla bir requirements.txt dosyası oluşturun:

    pyodbc
    fastapi
    uvicorn[standard]
    pydantic
    azure-identity
    
  2. Gereksinimleri yükleyin.

    pip install -r requirements.txt
    

Yerel bağlantı dizesi yapılandırma

Yerel geliştirme ve Azure SQL Veritabanı bağlanmak için aşağıdaki AZURE_SQL_CONNECTIONSTRING ortam değişkenini ekleyin. <database-server-name> ve <database-name> yer tutucularını kendi değerlerinizle değiştirin. Bash kabuğu için örnek ortam değişkenleri gösterilir.

Etkileşimli kimlik doğrulaması, yerel olarak çalışırken parolasız bir seçenek sağlar.

Microsoft Entra Interactive Authentication, Windows'ta bağlantı kurmak için Microsoft Entra çok faktörlü kimlik doğrulama teknolojisini kullanabilir. Bu modda, oturum açma kimliği sağlanarak bir Azure Kimlik Doğrulaması iletişim kutusu tetiklenerek kullanıcının bağlantıyı tamamlamak için parolayı girmesine izin verilir.

export AZURE_SQL_CONNECTIONSTRING='Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'

Daha fazla bilgi için bkz . ODBC Sürücüsü ile Microsoft Entra Id kullanma. Bu seçeneği kullanırsanız sizden kimlik bilgilerini isteyen pencereyi arayın.

azure portalından bağlantı dizesi oluşturmak için ayrıntıları alabilirsiniz:

  1. Azure SQL Server'a gidin, veritabanı adınızı bulmak için SQL veritabanları sayfasını seçin ve veritabanını seçin.

  2. veritabanında bağlantı dizesi bilgi almak için Bağlan ion dizeleri sayfasına gidin. ODBC sekmesinin altına bakın.

Not

Azure Arc'ı yüklediyseniz ve Azure aboneliğinizle ilişkilendirdiyseniz, App Service'e dağıtılan uygulama için gösterilen yönetilen kimlik yaklaşımını da kullanabilirsiniz.

Azure SQL Veritabanı bağlanmak için kod ekleme

Proje klasöründe bir app.py dosyası oluşturun ve örnek kodu ekleyin. Bu kod şu şekilde bir API oluşturur:

  • Ortam değişkeninden bir Azure SQL Veritabanı bağlantı dizesi alır.
  • Başlatma sırasında veritabanında bir Persons tablo oluşturur (yalnızca test senaryoları için).
  • Veritabanındaki tüm Person kayıtları almak için bir işlev tanımlar.
  • Veritabanından bir Person kayıt almak için bir işlev tanımlar.
  • Veritabanına yeni Person kayıtlar eklemek için bir işlev tanımlar.
import os
import pyodbc, struct
from azure import identity

from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel

class Person(BaseModel):
    first_name: str
    last_name: Union[str, None] = None
    
connection_string = os.environ["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("""
            CREATE TABLE Persons (
                ID int NOT NULL PRIMARY KEY IDENTITY,
                FirstName varchar(255),
                LastName varchar(255)
            );
        """)

        conn.commit()
    except Exception as e:
        # Table may 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(f"INSERT INTO Persons (FirstName, LastName) VALUES (?, ?)", item.first_name, item.last_name)
        conn.commit()

    return item

def get_conn():
    credential = identity.DefaultAzureCredential(exclude_interactive_browser_credential=False)
    token_bytes = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
    token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
    SQL_COPT_SS_ACCESS_TOKEN = 1256  # This connection option is defined by microsoft in msodbcsql.h
    conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
    return conn

Uyarı

Örnek kod, üretim kodunda kullanılmaması gereken ham SQL deyimlerini gösterir. Bunun yerine, veritabanınıza erişmek için daha güvenli bir nesne katmanı oluşturan SqlAlchemy gibi bir Nesne İlişkisel Eşleyici (ORM) paketi kullanın.

Uygulamayı yerel olarak çalıştırma ve test edin

Uygulama yerel olarak test edilmeye hazırdır.

  1. app.py Dosyayı Visual Studio Code'da çalıştırın.

    uvicorn app:app --reload
    
  2. Uygulamanın http://127.0.0.1:8000/docsSwagger kullanıcı arabirimi sayfasında POST yöntemini genişletin ve Deneyin'i seçin.

    API için oluşturulan başka bir belge biçimini görmek için try /redoc komutunu da kullanabilirsiniz.

  3. Örnek JSON'ı ad ve soyadı değerlerini içerecek şekilde değiştirin. Veritabanına yeni bir kayıt eklemek için Yürüt'e tıklayın. API başarılı bir yanıt döndürür.

  4. Swagger kullanıcı arabirimi sayfasında GET yöntemini genişletin ve Deneyin'i seçin. Yürüt'e tıklayın ve yeni oluşturduğunuz kişi döndürülür.

Azure App Service’e dağıtma

Uygulama Azure'a dağıtılmaya hazırdır.

  1. Azure Uygulaması Hizmeti'nde gunicorn'un vicorn çalıştırabilmesi için bir start.sh dosyası oluşturun. start.sh bir satırı vardır:

    gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app
    
  2. Kodu App Service'e dağıtmak için az webapp up komutunu kullanın. (Kaynağı oluşturmadan komutun ne yaptığını görmek için seçeneğini -dryrun kullanabilirsiniz.)

    az webapp up \
        --resource-group <resource-group-name> \
        --name <web-app-name>         
    
  3. App Service'i start.sh dosyasını kullanacak şekilde yapılandırmak için az webapp config set komutunu kullanın.

    az webapp config set \
        --resource-group <resource-group-name> \
        --name <web-app-name> \
        --startup-file start.sh
    
  4. App Service için sistem tarafından atanan yönetilen kimliği etkinleştirmek için az webapp identity assign komutunu kullanın.

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

    Bu hızlı başlangıçta, gösterim için sistem tarafından atanan yönetilen kimlik kullanılır. Kullanıcı tarafından atanan yönetilen kimlik, daha geniş bir senaryo aralığında daha verimlidir. Daha fazla bilgi için bkz . Yönetilen kimlik en iyi uygulama önerileri. Pyodbc ile kullanıcı tarafından atanan yönetilen kimlik kullanma örneği için bkz. Azure SQL Veritabanı ile parolasız bağlantıları kullanmak için Python uygulamasını geçirme.

App Service'i Azure SQL Veritabanı Bağlan

Veritabanını yapılandırma bölümünde, Azure SQL veritabanı sunucusu için ağ ve Microsoft Entra kimlik doğrulamasını yapılandırmıştınız. Bu bölümde veritabanı yapılandırmasını tamamlayacak ve App Service'i veritabanı sunucusuna erişmek için bir bağlantı dizesi yapılandıracaksınız.

Bu komutları çalıştırmak için SQL Server Management Studio (SSMS), Azure Data Studio ve SQL Server mssql uzantısıyla Visual Studio Code dahil olmak üzere Azure SQL Veritabanı bağlanabilen herhangi bir aracı veya IDE'yi kullanabilirsiniz. Ayrıca, Hızlı Başlangıç: Azure portal sorgu düzenleyicisini kullanarak Azure SQL Veritabanı sorgulama bölümünde açıklandığı gibi Azure portalını da kullanabilirsiniz.

  1. Parolasız erişim için kullanıcı ve rol oluşturmak için SQL komutlarıyla Azure SQL Veritabanı bir kullanıcı ekleyin.

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

    Daha fazla bilgi için bkz. Bağımsız Veritabanı Kullanıcıları - Veritabanınızı Taşınabilir Hale Getirme. Aynı ilkeyi gösteren ancak Azure VM'ye uygulanan bir örnek için bkz . Öğretici: Azure SQL'e erişmek için Windows VM sistem tarafından atanan yönetilen kimliği kullanma. Atanan roller hakkında daha fazla bilgi için bkz . Sabit veritabanı Rolleri.

    App Service sistem tarafından atanan yönetilen kimliği devre dışı bırakır ve etkinleştirirseniz kullanıcıyı bırakın ve yeniden oluşturun. ve komutlarını CREATE çalıştırın DROP USER [<web-app-name>] ve ALTER yeniden çalıştırın. Kullanıcıları görmek için kullanın SELECT * FROM sys.database_principals.

  2. bağlantı dizesi için bir uygulama ayarı eklemek için az webapp config appsettings set komutunu kullanın.

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

    Dağıtılan uygulama için bağlantı dizesi şuna benzemelidir:

    Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30
    

    ve <database-name> değerlerini <dabaser-server-name> değerlerinizle doldurun.

    Parolasız bağlantı dizesi kullanıcı adı veya parola içermez. Bunun yerine, uygulama Azure'da çalıştırıldığında, kod ile pyodbckullanılacak bir belirteç almak için Azure Kimlik kitaplığındankullanırDefaultAzureCredential.

Dağıtılan uygulamayı test edin

Azure SQL Veritabanı bağlantısının çalışıp çalışmadığını test etmek için uygulamanın URL'sine göz atın. Uygulamanızın URL'sini App Service'e genel bakış sayfasında bulabilirsiniz.

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

Swagger kullanıcı arabirimini görmek ve API yöntemlerini test etmek için URL'ye /docs ekleyin.

Tebrikler! Uygulamanız artık hem yerel hem de barındırılan ortamlardaki Azure SQL Veritabanı bağlı.