Db2でpandas.read_sql() を使用してpandas.DataFrameにSELECTの結果を入れる方法です。
Jupyter NotebookからDb2に簡単アクセスの「7. SELECTの結果セットのPythonの変数への代入」を使ってもできるのですが、前準備の説明が面倒なので、単に定型実行するだけならこっちがいいかな? と思い、メモとして書いておきます。
あと「Flask + SQLAlchemyでコネクションプールを使ってDb2に接続 & SQL実行(ORMなし)」でも同じような説明は書いていますが、Flask中心なので、抜き出して説明します。
前準備: 必要モジュールの導入
必要なモジュールが未導入の場合は、以下のコマンドでインストールします。
pip install ibm_db ibm_db_sa sqlalchemy pandas
1. 手順
1. SQLAlchemyのDb2接続URLの作成
以下になります。({}はDbの接続情報で置き換えます):
ibm_db_sa://{username}:{password}@{hostname}:{port}/{database};
SSL接続の場合は最後にSECURITY=SSL;
を付加します。
ibm_db_sa://{username}:{password}@{hostname}:{port}/{database};SECURITY=SSL;
パスワードに @ などの特殊文字が含まれていると正しく動作しないため、URLエンコードが必要です。
参考: Escaping Special Characters such as @ signs in Passwords
以下は、パスワード「kx@jj5/g」を含むURLの例です。「at」記号とスラッシュ文字は、それぞれ%40と%2Fとして表現されます:
from urllib.parse import quote_plus
password = quote_plus("kx@jj5/g")
print(password)
出力:
kx%40jj5%2Fg
2. SQLAlchemyのエンジンを作成
engine = create_engine(url)
でSQLAlchemyのエンジンを作成します
engine = create_engine(url)
3. 作成したエンジンを指定してpd.read_sqlを実行
sql_str = "SELECT * FROM EMPLOYEE"
df_emp = pd.read_sql(sql_str, engine)
2. サンプルコード
from sqlalchemy import create_engine
from urllib.parse import quote_plus
# DB2の接続情報を設定
database = "BLUDB"
username = "user01"
password = quote_plus("p@ssw0rd")
hostname = "aaa-bbb.cloud.ibm.com"
port = "50001"
# SQLAlchemyのエンジンを作成
url = f"ibm_db_sa://{username}:{password}@{hostname}:{port}/{database};SECURITY=SSL;"
engine = create_engine(url)
# pandas.read_sql() を使用して pandas.DataFrame 型の df_emp に SELECT の結果を格納
sql_str = "SELECT * FROM EMPLOYEE"
df_emp = pd.read_sql(sql_str, engine)
以上です。