SQL ServerのテーブルをPandas DataFrameで読み書きする

SQL ServerのテーブルをPandasのDataFrameに読み込んだり、逆に書き出したりする方法の備忘録です。

ドライバにpymssqlを使います。また書き出しには

$ pip install pymssql SQLAlchemy

DataFrameへの読み込み

まずはSQL ServerのテーブルからDataFrameへ読み込みます。

read_sqlメソッドを使います。

import pandas as pd

# 接続情報
server = "db.host"
database = "db_name"
username = "user_name"
password = "PaSsWoRd"

with pymssql.connect(server=server, user=username, password=password, database=database) as conn:
    sql = """
    SELECT
        id,
        name,
        email,
        created_at
    FROM users
    """
    
    df = pd.read_sql(sql, conn)

テーブルへの書き込み

今度はDataFrameからテーブルへです。

流れは、SQLAlchemyでお目当てのDBに接続し、to_sqlメソッドで書き込みます。

  • nameはテーブル名、schema はスキーマ名をそれぞれ指定
  • conにSQLAlchemyのDBエンジンを渡す
  • if_existsにはテーブルが存在した場合の挙動で、"append"なら気にせずインサート、"replace"なら再作成、"fail"ならそこでエラーになります (デフォルトは"fail")
  • indexがFalseの場合はインデックスをインサートするカラムに含めないようにします (デフォルトはTrue)
    • インデックスのカラム名は index_label で指定できます (指定しない場合はインデックス名がそのまま使われます)
from sqlalchemy import create_engine

connection_string = 'mssql+pymssql://user_name:PaSsWoRd@db.host/db_name'

engine = create_engine(connection_string)

df.to_sql(name='users', con=engine, schema='dbo', if_exists='append', index=False)