概要
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()メソッドを使う部分です。このメソッドを使うことで、一行づつのレコード挿入ではなく一括で挿入してくれます。
まとめ
一括挿入のコード自体はシンプルに書けました。ただ、パフォーマンスについては検証できていないので、今後時間など測ってみたいと思います。