次の方法で共有


クイック スタート: Python 用 mssql-python ドライバーを使用した迅速なプロトタイプ作成

このクイック スタートでは、 Streamlit を使用してレポートをすばやく作成します。これにより、ユーザーフィードバックをすばやく収集して、正しい軌道に乗っていることを確認できます。Python 用 mssql-python ドライバーを使用してデータベースに接続し、レポートに読み込まれたデータを読み取ります。

mssql-python ドライバーでは、Windows マシンへの外部依存関係は必要ありません。 ドライバーは、1 つの pip インストールで必要なすべてのものをインストールします。これにより、アップグレードとテストの時間がない他のスクリプトを中断することなく、新しいスクリプトに最新バージョンのドライバーを使用できます。

mssql-python のドキュメント | mssql-python ソース コード | パッケージ (PyPI) | Uv

[前提条件]

  • Python 3

    • Python をまだお持ちでない場合は、python.org から Python ランタイムpip パッケージ マネージャーインストールします。

    • 自分の環境を使いたくないですか? GitHub Codespaces を使用して devcontainer として開きます。

  • Visual Studio Code と次の拡張機能:

  • macOS および Linux でのパスワードレス認証用の Azure Command-Line インターフェイス (CLI)。

  • uvがまだない場合は、インストール手順に従います。

  • Fabric の SQL Server、Azure SQL Database、または SQL データベースにある、AdventureWorks2025 サンプルスキーマと有効な接続文字列を備えたデータベース。

  • オペレーティング システム固有の 1 回限りの前提条件をインストールします。

    apk add libtool krb5-libs krb5-dev
    

SQL データベースを作成する

このクイック スタートでは、Microsoft SQL Server の AdventureWorks2025 ライトウェイト スキーマ、Fabric の SQL データベース、または Azure SQL Database が必要です。

プロジェクトを作成してコードを実行する

新しいプロジェクトを作成する

  1. 開発ディレクトリでコマンド プロンプトを開きます。 お持ちでない場合は、 pythonscriptsなどの名前の新しいディレクトリを作成します。OneDrive 上のフォルダーを避け、同期によって仮想環境の管理が妨げられる可能性があります。

  2. を使用して新しいuvを作成します。

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

依存関係の追加

同じディレクトリに、 mssql-pythonstreamlit、および python-dotenv パッケージをインストールします。

uv add mssql-python python-dotenv streamlit

Visual Studio Code を起動します

同じディレクトリで、次のコマンドを実行します。

code .

pyproject.toml を更新する

  1. pyproject.toml には、プロジェクトのメタデータが含まれています。 お気に入りのエディターでファイルを開きます。

  2. 説明をよりわかりやすいものに更新します。

    description = "A quick example of rapid prototyping using the mssql-python driver and Streamlit."
    
  3. ファイルを保存して閉じます。

main.py の更新

  1. main.pyという名前のファイルを開きます。 この例のようになります。

    def main():
     print("Hello from rapid-protyping-qs!")
    
     if __name__ == "__main__":
       main()
    
  2. ファイルの先頭に、 def main()行の上に次のインポートを追加します。

    ヒント

    Visual Studio Code でパッケージの解決に問題がある場合は、 インタープリターを更新して仮想環境を使用する必要があります。

    from os import getenv
    from dotenv import load_dotenv
    from mssql_python import connect, Connection
    import pandas as pd
    import streamlit as st
    
  3. インポートと def main()行の間に、次のコードを追加します。

    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] c inner join SalesLT.SalesOrderHeader 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 sod inner join SalesLT.SalesOrderHeader soh on sod.salesorderid = soh.salesorderid inner join SalesLT.Product p on sod.productid = p.productid inner join SalesLT.ProductCategory 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 sod inner join SalesLT.SalesOrderHeader soh on sod.salesorderid = soh.salesorderid inner join SalesLT.Product p on sod.productid = p.productid inner join SalesLT.ProductCategory 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] 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] soh INNER JOIN SalesLT.SalesOrderDetail sod on soh.SalesOrderId = sod.SalesOrderId WHERE CustomerID = ?;"""
           st.dataframe(load_data(SQL_QUERY, params=(customer_id,)), hide_index=True, use_container_width=True)
    
  4. インポートと def page_load() -> None:の間に、このコードを追加します。

    _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. このコードを見つけなさい。

    def main():
        print("Hello from rapid-protyping-qs!")
    
  6. これをこのコードに置き換えます。

    def main() -> None:
        page_load()
        if _connection:
            _connection.close()
    
  7. main.pyを保存して閉じます。

接続文字列を保存する

  1. .gitignore ファイルを開き、.env ファイルの除外を追加します。 ファイルは次の例のようになります。 完了したら、必ず保存して閉じてください。

    # Python-generated files
    __pycache__/
    *.py[oc]
    build/
    dist/
    wheels/
    *.egg-info
    
    # Virtual environments
    .venv
    
    # Connection strings and secrets
    .env
    
  2. 現在のディレクトリに、 .envという名前の新しいファイルを作成します。

  3. .env ファイル内に、SQL_CONNECTION_STRINGという名前の接続文字列のエントリを追加します。 ここでの例を実際の接続文字列の値に置き換えます。

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

    ヒント

    ここで使用される接続文字列は、接続先の SQL データベースの種類によって大きく異なります。 Fabric で Azure SQL Database または SQL データベースに接続する場合は、[接続文字列] タブから ODBC 接続文字列を使用します。シナリオによっては、認証の種類の調整が必要になる場合があります。 接続文字列とその構文の詳細については、 接続文字列の構文リファレンスを参照してください。

uv run を使用してスクリプトを実行する

ヒント

macOS では、 ActiveDirectoryInteractiveActiveDirectoryDefault の両方が Microsoft Entra 認証で機能します。 ActiveDirectoryInteractive スクリプトを実行するたびにサインインするように求められます。 サインイン プロンプトが繰り返し表示されないようにするには、を実行して az loginで 1 回サインインしてから、ActiveDirectoryDefaultを使用します。これにより、キャッシュされた資格情報が再利用されます。

  1. 以前のターミナル ウィンドウで、または同じディレクトリに対して新しいターミナル ウィンドウを開き、次のコマンドを実行します。

     uv run streamlit run main.py
    
  2. レポートが Web ブラウザーの新しいタブで開きます。

  3. レポートを試して、そのしくみを確認してください。 何かを変更する場合は、 main.py 保存し、ブラウザー ウィンドウの右上隅にある再読み込みオプションを使用します。

  4. プロトタイプを共有するには、 .venv フォルダーを除くすべてのファイルを他のコンピューターにコピーします。 .venv フォルダーは、最初の実行で再作成されます。

次のステップ

その他の例については、 mssql-python ドライバーの GitHub リポジトリを参照して、アイデアの投稿や問題の報告を行います。