【Python】cx_Oracleでデータを一括挿入する方法
概要
pythonからOracleデータベースを操作するライブラリとしてcx_Oracleがあります。cx_Oracleを使ってOracleデータベースへレコードを挿入することはもちろん可能ですが、 大量のレコードを挿入したい場合 は1レコードずつだと時間がかかってしまいます。今回はこれを少しでも短い時間で実現するために、 一括で挿入する 方法について実践してみました。
環境
python 3.7.3
Oracle 18c Express Edition
無料で使用できるOracle Express Editionのインストール方法についてはこちらを参考にしてください。
Step1 : Oracle側テーブル作成
まずはOracle側にテスト用のとして、USER01というスキーマを定義し、その下にoracle_insertという名前のテーブルオブジェクトを作りました。
SQLは以下のようなコードです。
CREATE TABLE USER01.ORACLE_INSERT(
col1 int
,col2 int
,col3 int
)
Step2 : Pythonによる一括挿入コード
続いてPythonから先ほど作成したOracleのテーブルへデータを挿入するコードを書いていきます。流れとしては以下です。
- datasetで挿入するデータを作成
- cx_Oracleで接続を作成
- cur.executemany()で 引数にsqlとdatasetを入れ、 一括で挿入
- commitとconnection.closeして終了
#cx_Oracleライブラリの読み込み
import cx_Oracle
#リスト型でデータセットを定義
dataset =[
[1,2,3]
,[4,5,6]
,[7,8,9]
,[10,11,12]
,[13,14,15]
,[16,17,18]
,[19,20,21]
]
#Oracleデータベースへの接続情報の定義
HOST = 'localhost'
PORT = '1521'
DB_NAME = 'xepd1'
USER = 'user01'
PASSWORD = 'password01'
SERVICE_NAME = 'xepdb1'
#接続の作成
tns = cx_Oracle.makedsn(HOST, PORT, service_name =SERVICE_NAME)
conn = cx_Oracle.connect(USER,PASSWORD,tns)
#カーソルの取得
cur = conn.cursor()
#一括挿入
cur.executemany("insert into user01.oracle_insert (col1, col2, col3) values (:1, :2 ,:3)", dataset)
#コミット
conn.commit()
#コネクション切断
conn.close()
一括挿入するための仕掛けとしてはexecutemany()メソッドを使う部分です。このメソッドを使うことで、一行づつのレコード挿入ではなく一括で挿入してくれます。
まとめ
一括挿入のコード自体はシンプルに書けました。ただ、パフォーマンスについては検証できていないので、今後時間など測ってみたいと思います。
以上
Pythonを一から学ぶのにおすすめの本はコチラ