PythonでSQL Serverストアドプロシージャ結果をPandasデータフレームに格納!データサイエンスへの第一歩
SQL Server のストアド プロシージャの結果を Pandas データフレームに読み込む
前提条件
このチュートリアルを実行するには、次のものが必要です。
- Python がインストールされていること
pandas
ライブラリがインストールされていること- SQL Server データベースへの接続
手順
- 必要なライブラリをインポートする
import pandas as pd
import pyodbc
- SQL Server に接続する
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=myDatabase;UID=myUsername;PWD=myPassword')
- ストアド プロシージャを実行する
cursor = conn.cursor()
cursor.execute('EXEC myStoredProcedure @param1, @param2')
- 結果を Pandas データフレームに読み込む
df = pd.DataFrame(cursor.fetchall())
- データフレームを操作する
print(df.head())
例
次の例では、SalesOrderHeader
テーブルのデータを含む GetSalesOrderHeaders
というストアド プロシージャを実行し、結果を Pandas データフレームに読み込んで、最初の 5 行を表示します。
import pandas as pd
import pyodbc
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=myDatabase;UID=myUsername;PWD=myPassword')
cursor = conn.cursor()
cursor.execute('EXEC GetSalesOrderHeaders')
df = pd.DataFrame(cursor.fetchall())
print(df.head())
説明
pyodbc
ライブラリは、Python から SQL Server に接続するために使用されます。pandas.DataFrame
コンストラクタは、リスト、タプル、または辞書などのデータ構造から Pandas データフレームを作成するために使用されます。df.head()
メソッドは、データフレームの最初の n 行を表示するために使用されます。
- ストアド プロシージャのパラメータを指定するには、
cursor.execute()
メソッドの@param1
および@param2
などのプレースホルダを使用できます。 - 結果を Pandas データフレームに読み込む前に、列名を取得して
df.columns
に設定することをお勧めします。 - Pandas データフレームには、データの操作と分析に使用できるさまざまなメソッドと属性があります。
import pandas as pd
import pyodbc
# データベース接続
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=myDatabase;UID=myUsername;PWD=myPassword')
# カーソルオブジェクトの作成
cursor = conn.cursor()
# ストアドプロシージャの実行
cursor.execute('EXEC GetSalesOrderHeaders')
# 結果をフェッチ
results = cursor.fetchall()
# 列名を取得
column_names = [col[0] for col in cursor.description]
# Pandas データフレームの作成
df = pd.DataFrame(results, columns=column_names)
# 最初の5行を表示
print(df.head())
ライブラリのインポート:
データベース接続:
カーソルオブジェクトの作成:
結果のフェッチ:
列名の取得:
Pandas データフレームの作成:
最初の5行の表示:
- このコードは、SQL Server データベースがローカルホストにインストールされていることを前提としています。接続文字列を編集して、必要に応じてサーバー名、データベース名、ユーザー名、パスワードを変更してください。
GetSalesOrderHeaders
は、サンプルストアド プロシージャの名前です。この名前を、使用するストアド プロシージャの名前に変更する必要があります。- このコードは、基本的な例です。必要に応じて、コードを拡張して、エラー処理、追加のデータ操作などを追加できます。
SQLAlchemy は、Python で SQL データベースと対話するためのライブラリです。SQLAlchemy を使用すると、ストアド プロシージャを直接実行し、結果を Pandas データフレームに読み込むことができます。
import pandas as pd
from sqlalchemy import create_engine
# エンジンを作成
engine = create_engine('mssql://myUsername:myPassword@localhost/myDatabase')
# ストアドプロシージャを実行
df = pd.read_sql_query('EXEC GetSalesOrderHeaders', engine)
# 最初の5行を表示
print(df.head())
pyodbc と set.fetch() メソッドを使用する
pyodbc
ライブラリの set.fetch()
メソッドを使用して、ストアド プロシージャの結果を Pandas データフレームに直接変換することもできます。
import pandas as pd
import pyodbc
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=myDatabase;UID=myUsername;PWD=myPassword')
cursor = conn.cursor()
cursor.execute('EXEC GetSalesOrderHeaders')
df = pd.DataFrame(cursor.set.fetch())
print(df.head())
sp_executesql システムストアド プロシージャを使用する
sp_executesql
システムストアド プロシージャを使用して、SQL ステートメント (ストアド プロシージャを含む) を動的に実行し、結果を Pandas データフレームに読み込むことができます。
import pandas as pd
import pyodbc
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=myDatabase;UID=myUsername;PWD=myPassword')
cursor = conn.cursor()
# ストアドプロシージャを実行
cursor.execute('sp_executesql @sql = N''EXEC GetSalesOrderHeaders''', sql=None)
# 結果をフェッチ
results = cursor.fetchall()
# 列名を取得
column_names = [col[0] for col in cursor.description]
# Pandas データフレームの作成
df = pd.DataFrame(results, columns=column_names)
# 最初の5行を表示
print(df.head())
それぞれの方法の比較
方法 | 利点 | 欠点 |
---|---|---|
pandas-sql | シンプルで使いやすい | SQLAlchemy のインストールが必要 |
pyodbc と set.fetch() | シンプルでメモリ効率が良い | 列名を取得する必要がある |
sp_executesql | 柔軟性が高い | 複雑で分かりにくい |
最適な方法の選択
使用する方法は、個々のニーズと好みによって異なります。
- シンプルで使いやすい方法が必要な場合は、
pandas-sql
がおすすめです。 - メモリ効率が良い方法が必要な場合は、
pyodbc
とset.fetch()
がおすすめです。 - 柔軟性が高く、動的な SQL ステートメントを実行する必要がある場合は、
sp_executesql
がおすすめです。
これらの方法に加えて、pymssql
や aiomysql
などの他のライブラリを使用して、SQL Server のストアド プロシージャの結果を Pandas データフレームに読み込むこともできます。
sql-server stored-procedures pandas