Hızlı Başlangıç: Python için mssql-python sürücüsüyle hızlı prototip oluşturma

Bu hızlı başlangıçta, Streamlit kullanarak, kullanıcı geri bildirimlerini erkenden toplayabilmeniz için hızlıca bir rapor oluşturursunuz. Python için mssql-python sürücüsünü kullanarak veritabanınıza bağlanır ve raporunuza yüklenen verileri okursunuz.

Sürücü, mssql-python Windows makinelerinde dış bağımlılık gerektirmez. Sürücü, ihtiyaç duyduğu her şeyi tek pip bir yüklemeyle yükler ve yükseltmeye ve test etmeye vaktiniz olmayan diğer betikleri bozmadan yeni betikler için sürücünün en son sürümünü kullanmanıza olanak sağlar.

mssql-python belgeleri | mssql-python kaynak kodu | Paket (PyPI) | Uv

Önkoşullar

İşletim sistemi ön koşullarını kurma

Tek seferlik işletim sistemine özgü önkoşulları yükleyin. Windows kullanıcıları bu adımı atlayabilir. Platformun tam detayları için mssql-python'u Install sayfasına bakınız.

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

SQL veritabanı oluşturma

Aşağıdaki platformlardan birinde bir SQL veritabanı oluşturun veya bağlanın:

Projeyi oluşturma ve kodu çalıştırma

Yeni proje oluşturma

  1. Geliştirme dizininizde bir komut istemi açın. Eğer bir dizin yoksa, yeni bir dizin oluşturun, örneğin python veya scripts. OneDrive'ınızdaki klasörlerden kaçının, çünkü senkronizasyon sanal ortamınızı yönetmenize engel olabilir.

  2. ile yeni bir uv oluşturun.

    uv init rapid-prototyping-qs
    cd rapid-prototyping-qs
    

Bağımlılık ekleme

Aynı dizinde , mssql-pythonve streamlit paketlerini yükleyinpython-dotenv.

uv add mssql-python python-dotenv streamlit

Visual Studio Code'ı başlatma

Aynı dizinde aşağıdaki komutu çalıştırın.

code .

pyproject.toml güncelle

  1. pyproject.toml Dosyayı düzenleyicinizde açın. Bu dosya, projenizin meta verilerini içerir.

  2. Değeri description güncelleyin.

    description = "A quick example of rapid prototyping using the mssql-python driver and Streamlit."
    
  3. Dosyayı kaydedin ve kapatın.

Güncelle main.py

  1. adlı main.pydosyayı açın. Bu örneğe benzer olmalıdır.

    def main():
        print("Hello from rapid-prototyping-qs!")
    
    if __name__ == "__main__":
        main()
    
  2. Dosyanın en üstüne, def main() içeren satırdan önce aşağıdaki importları ekleyin.

    Tavsiye

    Visual Studio Code paketleri çözümleme konusunda sorun yaşıyorsa, yorumlayıcıyı sanal ortamı kullanacak şekilde güncelleştirmeniz gerekir.

    from os import getenv
    from dotenv import load_dotenv
    from mssql_python import connect, Connection
    import pandas as pd
    import streamlit as st
    
  3. İçeri aktarmalar ile satır def main() arasına aşağıdaki kodu ekleyin.

    def page_load() -> None:
        st.set_page_config(
            page_title="View Data",
            page_icon=":bar_chart:",
            layout="wide",
            initial_sidebar_state="expanded"
        )
    
        st.title("AdventureWorksLT Customer Order History")
    
        SQL_QUERY = """
        SELECT c.*
        FROM SalesLT.Customer AS c
        INNER JOIN SalesLT.SalesOrderHeader AS soh
            ON c.CustomerID = soh.CustomerID;
        """
    
        df = load_data(SQL_QUERY)
    
        event = st.dataframe(
            df,
            use_container_width=True,
            hide_index=True,
            on_select="rerun",
            selection_mode="single-row"
        )
    
        customer = event.selection.rows
    
        SPEND_QUERY_ALL = """
        SELECT
            soh.OrderDate,
            SUM(sod.OrderQty),
            SUM(sod.OrderQty * sod.UnitPrice) AS spend,
            pc.Name AS ProductCategory
        FROM SalesLT.SalesOrderDetail AS sod
        INNER JOIN SalesLT.SalesOrderHeader AS soh
            ON sod.SalesOrderID = soh.SalesOrderID
        INNER JOIN SalesLT.Product AS p
            ON sod.ProductID = p.ProductID
        INNER JOIN SalesLT.ProductCategory AS pc
            ON p.ProductCategoryID = pc.ProductCategoryID
        GROUP BY soh.OrderDate, pc.Name
        ORDER BY soh.OrderDate, pc.Name;
        """
        SPEND_QUERY_CUSTOMER = """
        SELECT
            soh.OrderDate,
            SUM(sod.OrderQty),
            SUM(sod.OrderQty * sod.UnitPrice) AS spend,
            pc.Name AS ProductCategory
        FROM SalesLT.SalesOrderDetail AS sod
        INNER JOIN SalesLT.SalesOrderHeader AS soh
            ON sod.SalesOrderID = soh.SalesOrderID
        INNER JOIN SalesLT.Product AS p
            ON sod.ProductID = p.ProductID
        INNER JOIN SalesLT.ProductCategory AS pc
            ON p.ProductCategoryID = pc.ProductCategoryID
        WHERE soh.CustomerID = ?
        GROUP BY soh.OrderDate, pc.Name
        ORDER BY soh.OrderDate, pc.Name;
        """
        if len(customer) == 0:
            spend_df = load_data(SPEND_QUERY_ALL)
        else:
            customer_id = int(df.loc[customer, 'CustomerID'].values[0])
            spend_df = load_data(SPEND_QUERY_CUSTOMER, params=(customer_id,))
    
        st.write("Here's a summary of spend by product category over time:")
        st.bar_chart(spend_df.set_index('ProductCategory')['spend'], use_container_width=True)
    
        if len(customer) > 0:
            st.write(f"Displaying orders for Customer ID: {df.loc[customer, 'CustomerID'].values[0]}")
            customer_id = int(df.loc[customer, 'CustomerID'].values[0])
            SQL_QUERY = """
            SELECT *
            FROM SalesLT.SalesOrderHeader AS soh
            WHERE soh.CustomerID = ?;
            """
            st.dataframe(load_data(SQL_QUERY, params=(customer_id,)), hide_index=True, use_container_width=True)
            SQL_QUERY = """
            SELECT sod.*
            FROM SalesLT.SalesOrderHeader AS soh
            INNER JOIN SalesLT.SalesOrderDetail AS sod
                ON soh.SalesOrderID = sod.SalesOrderID
            WHERE soh.CustomerID = ?;
            """
            st.dataframe(load_data(SQL_QUERY, params=(customer_id,)), hide_index=True, use_container_width=True)
    
  4. İmportlar ile def page_load() -> None: arasında, bu kodu ekleyin.

    _connection = None
    
    def get_connection() -> Connection:
        global _connection
        if not _connection:
            load_dotenv()
            _connection = connect(getenv("SQL_CONNECTION_STRING"))
        return _connection
    
    @st.cache_data
    def load_data(SQL_QUERY, params=None) -> pd.DataFrame:
        data = pd.read_sql_query(SQL_QUERY, get_connection(), params=params)
        return data
    
  5. Bu kodu bulun.

    def main():
        print("Hello from rapid-prototyping-qs!")
    
  6. Bu kodla değiştirin.

    def main() -> None:
        page_load()
        if _connection:
            _connection.close()
    
  7. kaydedin ve kapatın main.py.

Bağlantı dizesini kaydetme

  1. .gitignore dosyasını açın ve .env dosyaları için bir dışlama ekleyin. Dosyanız aşağıdaki örneğe benzer olmalıdır.

    # Python-generated files
    __pycache__/
    *.py[oc]
    build/
    dist/
    wheels/
    *.egg-info
    
    # Virtual environments
    .venv
    
    # Connection strings and secrets
    .env
    
  2. kaydedin ve kapatın .gitignore.

  3. Geçerli dizinde adlı .envyeni bir dosya oluşturun.

  4. dosyasının içine .env bağlantı dizeniz için adlı SQL_CONNECTION_STRINGbir girdi ekleyin. Yer tutucuları gerçek değerlerinizle değiştirin.

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

    Bağlantı dizesi, bağlandığınız SQL veritabanı türüne bağlıdır. Azure SQL Veritabanı veya Fabric'teki SQL veritabanı için, bağlantı dizileri sekmesindeki ODBC bağlantı dizesi'i kullanın ve senaryonuza göre kimlik doğrulama türünü ayarlayın. bağlantı dizesi sözdizimi hakkında daha fazla bilgi için mssql-python için bağlantı dizileri bölümünü inceleyebilirsiniz.

    Tavsiye

    macOS'ta hem ActiveDirectoryInteractive hem de ActiveDirectoryDefault Microsoft Entra kimlik doğrulaması için çalışır. ActiveDirectoryInteractive betiği her çalıştırdığınızda oturum açmanızı ister. Tekrar tekrar giriş istemlerini önlemek için, Azure CLIaz login komutuyla bir kez oturum açın ve ActiveDirectoryDefault kullanın. ActiveDirectoryDefault Önbelleğe alınan kimlik bilgilerini tekrar kullanır.

Betiği yürütmek için uv çalıştır komutunu kullan

  1. Önceki terminal penceresinde veya aynı dizine açılan yeni bir terminal penceresinde aşağıdaki komutu çalıştırın.

    uv run streamlit run main.py
    

    Raporunuz web tarayıcınızda yeni bir sekmede açılır.

  2. Nasıl çalıştığını görmek için raporunuzu deneyin. Herhangi bir şeyi değiştirirseniz, tarayıcı penceresinin sağ üst köşesindeki yeniden yükleme seçeneğini kaydedin main.py ve kullanın.

  3. Prototipinizi paylaşmak için .venv klasör dışındaki tüm dosyaları diğer makineye kopyalayın. Klasör .venv ilk çalıştırmayla yeniden oluşturulur.