この記事は公開から2年以上経過しています。
Oracle Database上のデータを加工してからSQL Serverに移行させる要件で、Pythonのcx_Oracle
、pyodbc
、sqlalchemy
と生SQLを使って試してみたので、その備忘録。
生SQLではなくORMを利用したい場合は「PythonでOracle DatabaseからSQL Serverにデータをコピーする(ORM編)」をご参照下さい。
テーブル構成
検証用のため、数値キー列と文字列値の列だけのシンプルな構成です。
Oracle Database側(コピー元):
CREATE TABLE TEST_TBL(ID INT PRIMARY KEY, VAL NVARCHAR2(50))
SQL Server側(コピー先)
CREATE TABLE TEST_TBL(ID INT PRIMARY KEY, VAL NVARCHAR(50))
サンプルソースコード
プログラムの実行には、Pythonのcx_Oracle
、pyodbc
、sqlalchemy
パッケージ、および各OS用のDBドライバー(Oracle Instant Client
、ODBC Driver for SQL Server
)が必要です。
プログラムを実行すると、Oracle DatabaseのTEST_TBL
レコードを一括で読み込み、トランザクションをかけてSQL ServerのTEST_TBL
に1行ずつ書き込みを行います。
import sqlalchemy as sqlalc
# Oracle Database設定(コピー元)
HOST_ORA = 'ora ip address'
SN_ORA = 'ora service name'
USER_ORA = 'ora db user'
PASSWORD_ORA = 'ora db password'
# SQL Server(コピー先)
HOST_MSSQL = 'mssql ip address'
DB_MSSQL = 'mssql db name'
USER_MSSQL = 'mssql db user'
PASSWORD_MSSQL = 'mssql db password'
# Oracle Databaseから指定テーブルの全レコードを取得する
tns_ora = f'(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {HOST_ORA})(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = {SN_ORA})))'
eng_ora = sqlalc.create_engine(f'oracle+cx_oracle://{USER_ORA}:{PASSWORD_ORA}@{tns_ora}')
rows_ora = eng_ora.execute('SELECT * FROM TEST_TBL').fetchall()
# SQL Serverに全レコードを書き込む
conn_str_mssql = f'DRIVER={{SQL Server}};SERVER={HOST_MSSQL};DATABASE={DB_MSSQL};UID={USER_MSSQL};PWD={PASSWORD_MSSQL}'
eng_mssql = sqlalc.create_engine(f'mssql+pyodbc:///?odbc_connect={conn_str_mssql}')
with eng_mssql.begin() as conn_mssql:
for row_ora in rows_ora:
conn_mssql.execute('INSERT INTO TEST_TBL(ID, VAL) VALUES(?,?)', row_ora.id, row_ora.val)
Pythonだと実質数行で書けてしまうのが、素晴らしいです。
参考ウェブサイトなど
- SQL Alchemy
SQLAlchemy 1.4 Documentation
以上です。