はじめに
Dr.sum EA上のテーブルやビューにアクセスするのに、毎回EnterpriseManagerからCSVでダウンロードしていたのですが、さすがにしんどいので、Pythonから直接アクセスしたいと思っていました。
Python×Dr.sum EAについて
2つの方向があり、今回は「PythonからDr.sum EAを呼び出す方」について書きます。
Dr.sum EAからPythonを呼び出す
Dr.sum EAには Python連携機能(Python Develop Tool) というのがあり、Dr.sum EAサーバ上に配置したPythonスクリプトを、Dr.sum EA上で実行できるというものです。
EnterpriseManager経由で、ローカルPCからDr.sum EAサーバへスクリプトを移送したり、pip installなどライブラリをインストールできるようです。
詳しくはオンラインマニュアルや他の記事を参照ください。
Dr.sum EA V5.6 オンラインマニュアル | Python Develp Tool
PythonからDr.sum EAを呼び出す
この記事で紹介するのは、PythonからDr.sum EAを呼び出す方法のほうです。
具体的には、PostgreSQLやMySQLなどのリレーショナルDBと同じように、Dr.sum EA上のテーブルやビューを取得し、PandasやMatlotlibやScikit-learnなどで少し触ってみるというのを想定しています。
元々は、EnterpriseManagerからエクスポートしたり、Dr.sum EA Datalizerなどからドリルスルーや明細表で取得したデータを使っていたのですが、いまさらですがさすがに何やってんねん俺って思ったので、他のRDBと同じようにならんのかと思いやってみました。
PythonからDr.sum EA上のデータを参照する
Dr.sum EAはデータウェアハウスとして優秀な製品のひとつですが、一般的なリレーショナルDBのように振る舞わせて取り扱うこともできます。
そこで、リレーショナルDBからデータを取得する際に用いられる一般的な方法であるODBCドライバーやJDBCドライバーを使って、Pythonからデータを呼び出してみようと思います。
Dr.sum EAのODBCドライバーおよびJDBCドライバーは、Dr.sum EAをサーバにインストールするための「インストールメディア」の「Development Kit」に含まれています。
ODBCドライバー編
-
スタートメニューからODBCデータソース(64bit)を開いて以下設定する
※Dr.sumのインストールメディアでEnterpriseManagerなどをインストールする際に、ODBCドライバーのインストールも選択できたはず
-
接続テストをしたければユーザ・パスワード・DB名を入力する。入力してもしなくてもどちらでもよい。入力しておけばPythonスクリプトにシークレットを記載せずに済む。特にユーザとパスワード。
-
環境に先に
pyodbc
を入れておく
pip install pyodbc
あとは以下のスクリプトで実行。
import pyodbc
with pyodbc.connect('DSN=DRSUM_EA;') as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM your_table")
results=cursor.fetchall()
results
もし毎回入れたい場合は以下。
import pyodbc
conn_str = (
'DSN=DRSUM_EA;'
'UID=your_userid;'
'PWD=your_password;'
'DATABASE=your_dbname;'
)
with pyodbc.connect(conn_str) as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM your_table")
results=cursor.fetchall()
results
もし、自分しか管理しないPythonスクリプトであれば、このまま直打ちでも最悪いいけど、うっかりこのままgitにあげると恥ずかしいし、なんかむずがゆい。
なので、シークレット情報を.envファイルに分けて記載し、python-dotenvを使って読み込んだほうがよい。
DRSUM_UID=your_userid
DRSUM_PWD=your_password
import os
from dotenv import load_dotenv
import pyodbc
load_dotenv()
user = os.getenv("DRSUM_UID")
password = os.getenv("DRSUM_PWD")
conn_str = (
f'DSN=DRSUM_EA;'
f'UID={user};'
f'PWD={password};'
f'DATABASE=your_dbname;'
)
with pyodbc.connect(conn_str) as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM your_table")
results=cursor.fetchall()
results
ただ、システムDSNにuserとpasswordを記憶させておくほうが間違いはない気はする。
JDBCドライバー編
同じく、JDBCドライバーも利用できます。
- Dr.sum EAのインストールメディアを使ってDevelopmentKitをインストールしたPCで、
C:\DrSumXX\DevKit\java\jdbc\dwodsjd4.jar
があることを確認する(なければインストールメディアからDevelopmentKitを入れる) - JDBCドライバーを動かすために、そのPCにJavaが入っていることを確認する(なければ入れる。AdoptiumとかMicrosoft Build of OpenJDKとか)
-
pip install JayDeBeAPI
しておく - 以下スクリプトを実行する。your_serverには接続先Dr.sum EAのホスト名かIDアドレスなどを入れて、your_dbnameにはDBNAMEを入れる。
# %%
from contextlib import closing
import jaydebeapi
jdbc_driver = "jp.co.dw_sapporo.JDBC.JDBCDriver" # なんでsapporoなんだろう。
jdbc_url = "jdbc:dwods:your_server:6001:your_dbname"
jar_path = ["C:/DrSum56/DevKit/java/jdbc/dwodsjd4.jar"]
user = "your_userid"
password = "your_password"
with closing(
jaydebeapi.connect(jdbc_driver, jdbc_url, [user, password], jar_path)
) as conn:
with closing(conn.cursor()) as cursor:
cursor.execute("SELECT * FROM your_table")
results = cursor.fetchall()
results
userとpasswordは、ODBCドライバー編で紹介した.envを使った方法のほうがなおよい。
参考
Pythonでなくとも、DBevberやA5:SQL Mk2などのフリーのSQL実行ツールでも、Dr.sumのデータにアクセスすることができます。超やさしい解説記事もあります。
読んでたら目が冴えて眠れなくなるTech Blog。
おわりに
わざわざPythonやEnterpriseManager使わなくとも、DBeaverかA5:SQL Mk2つかえばええやんと今更思い直してしまった。最近あまり使わなくなってワスレテタ。TECH BLOG読み漁りましょう。
本件については別に何の知見もないし、できて当然っちゃ当然なのですが、いままで何となく手を出していなかったし、そういえばできるよなと思い、自分のメモの代わりに記載しました。
個人的に、いまはデータカタログに興味があります。Dr.sumやMotionboardと連携されて、データを呼び出したら自動的にメタデータも一緒に払い出されて、LLMに読み込ませたらチョチョイーとコンテキスト理解してくれて…とか。