Dr.Sumとは
Dr.Sumは、経営や営業などの業務の現場で、企業内の基幹データベースの情報を高速に集計できるBIツールです。
詳しくはマニュアルを参照
Dr.Sumへの接続
Dr.Sumへの接続は下記の4つが提供されている。
- JavaAPI
- .NETAPI
- JDBC
- ODBC
今回はPythonから接続するため、下記のPythonライブラリを使用し、JDBCとODBCで接続してみます。
JDBC
Dr.SumへのJDBC接続では JayDeBeApi というライブラリを使用します。
このライブラリを使ことでPythonでJDBCドライバが使えるようになります。
JDBCドライバの確認
Dr.SumのDevKitをインストールするとインストールディレクトリ配下にJDBCドライバが格納されます。
<Dr.Sumインストールフォルダ>\DevKit\java\jdbc\dwodsjd4.jar
JayDeBeApi のインストール
pip install JayDeBeApi
PythonからJDBC接続
本記事では後々扱いやすいようにDataFrameでデータを取得しています。
# ライブラリのインポート
import jaydebeapi as jdba
import pandas as pd
# 接続
conn = jdba.connect("jp.co.dw_sapporo.JDBC.JDBCDriver",
"jdbc:dwods:<host>:<6001>:<DB名>",
[<userID>, <Password>],
"C:\DrSum56\DevKit\java\jdbc\dwodsjd4.jar")
curs = conn.cursor()
# SQLの実行
sql = "select * from <テーブル名>"
dataset = pd.read_sql_query(sql, conn)
ODBC
Dr.SumへのODBC接続では pyodbc というライブラリを使用します。
このライブラリを使ことでPythonでODBCドライバが使えるようになります。
ODBCドライバの確認
[Windowsスタートメニュー]-[Windows管理ツール]-[ODBCデータソース]-[システムDSN]をクリックしてください。
追加をクリックするとインストール済みのODBCドライバが確認できます。
下記のように接続したいバージョンのDr.SumのODBCドライバが表示されていればOKです。
pyodbc のインストール
pip install pyodbc
PythonからODBC接続
本記事では後々扱いやすいようにDataFrameでデータを取得しています。
# ライブラリのインポート
import pyodbc
import pandas as pd
# 接続
conn = pyodbc.connect(DRIVER="Dr.Sum 5.6 ODBC Driver",
HOST=<host>, DATABASE=<DB名>,user=<userID>,
password=<Password>, port=6001
)
curs = conn.cursor()
# SQLの実行
sql = "select * from <テーブル名>"
dataset = pd.read_sql_query(sql, conn)
データのインポート
def dsImport(df):
try:
cnxn = pyodbc.connect('DSN={DSN}; UID={ID}; PWD={PW}'.format(DSN=DSN,ID=ID,PW=PW))
cursor = cnxn.cursor()
logging.info("Connected to the database.")
logging.info("The import process has started.")
columns = df.columns.values
for index, row in df.iterrows():
column = ','.join(str(s) for s in columns)
value = '","'.join(str(s) for s in row.tolist())
query = 'INSERT INTO {tbl} ( {col} ) VALUES( "{val}" );'.format(tbl=TBL,col=column,val=value)
print(query)
r = cursor.execute(query)
except:
cnxn.rollback()
logging.error("Roll back because an error occurred during data import.")
else:
cnxn.commit()
logging.info("Data import is complete.")