【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は以下のようなコードです。
01 02 03 04 05 | 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して終了
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #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を一から学ぶのにおすすめの本はコチラ