Loading [MathJax]/extensions/tex2jax.js

【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を一から学ぶのにおすすめの本はコチラ

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です