PythonでOracle DatabaseからSQL Serverにデータをコピーする(SQL編)

この記事は公開から2年以上経過しています。

Oracle Database上のデータを加工してからSQL Serverに移行させる要件で、Pythonのcx_Oraclepyodbcsqlalchemyと生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_Oraclepyodbcsqlalchemyパッケージ、および各OS用のDBドライバー(Oracle Instant ClientODBC 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だと実質数行で書けてしまうのが、素晴らしいです。


参考ウェブサイトなど

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする