sqlite3で1行のINSERT文で複数のデータを挿入する方法

プログラミング SQLite

sqlite3で1行のINSERT文で複数のデータをPythonで同時に挿入するにはexecutemany()メソッドを利用します。

通常の1行のINSERT文で1行のデータを挿入するにはexecute()メソッドを利用すればよいのですが、複数行のデータを1行のINSERT文で挿入するには専用のexecutemany()が用意されています。

スポンサーリンク

sqlite3で1行のINSERT文で複数のデータを挿入する

SQLServerではデータ行をカンマくぐりでINSERTすれば複数行のデータを1行のINSERT文で挿入できますが、Pythonでのsqlite3ではexecutemany()メソッドを利用します。

1行のINSERT文で複数のデータを挿入する方法
SQLServer2008で実行できるようになった1行のINSERT文で複数件挿入するSQLは「VALUES以降をカンマで区切って」渡せば挿入できます。ただし挿入できるのは最大1000行までとHELPにありますので、それ以上の場合はINSERT文を分けて実行する必要があります。

sqlite3で1行のINSERT文で複数のデータを挿入(正常パターン)

まずは複数行のINSERT文が正常に終了する場合の動作を確認します。
サンプルプログラムはpythonで作成しています。

import sqlite3

#複数行の挿入データ
persons = [
     ( 1,    "東京   太郎", 10 )
    ,( 2,    "大阪   次郎", 20 )
    ,( 3,    "福岡   三郎", 30 )
    ]

#データベースオープン
con = sqlite3.connect( ":memory:" )    #インメモリーデータベース

#テーブル作成
con.execute( "CREATE TABLE person( no NOT NULL, name, age )" )

#データ挿入(実験なのでエラーが起きても無視して突き進む)
try:
    con.executemany( "INSERT INTO person( no, name, age ) VALUES ( ?, ?, ? )",  persons )
except:
    pass
finally:
    pass

#データ表示
for row in con.execute( "SELECT no, name, age FROM person ORDER BY no" ):
    print( row )

#データベースクローズ
con.close()

この処理の「executemany()」は正常に終了するので実行結果は

(1, '東京   太郎', 10)
(2, '大阪   次郎', 20)
(3, '福岡   三郎', 30)

と指定した3件のレコードが挿入させSELECTされます。

sqlite3で1行のINSERT文で複数のデータを挿入(エラーパターン)

次にINSERT文でエラーが発生する場合の処理を確認します。

今回はINSERT文でエラーが発生してもRollbackするのではなく、そのままAutoCommitで突き進んでいます。

この処理もPythonで作成しています。

import sqlite3

#複数行の挿入データ
persons1 = [
     ( 1,    "東京   太郎", 10 )
    ,( 2,    "大阪   次郎", 20 )
    ,( None, "エラー 三郎", 30 )
    ,( 4,    "福岡   四郎", 40 )
    ]

#データベースオープン
con = sqlite3.connect( ":memory:" )    #インメモリーデータベース

#テーブル作成
con.execute( "CREATE TABLE person( no NOT NULL, name, age )" )

#データ挿入(実験なのでエラーが起きても無視して突き進む)
try:
    con.executemany( "INSERT INTO person( no, name, age ) VALUES ( ?, ?, ? )",  persons1 )
except:
    pass
finally:
    pass

#データ表示
for row in con.execute( "SELECT no, name, age FROM person ORDER BY no" ):
    print(row)

#データベースクローズ
con.close()

この処理は3件目のデータでNOT NULL指定のカラムにワザとデータを入れないようにしてあるので、そこでエラーが発生します。

なので実行結果は

(1, '東京   太郎', 10)
(2, '大阪   次郎', 20)

と2行目まで正常に挿入され、4行目は処理が実行されていないのでデータベースのテーブルには挿入されていません。

まとめ

sqlite3で1行のINSERT文で複数のデータを同時に挿入するにはexecutemany()メソッドを利用すれば簡単に実装できます。

万が一、途中のデータに不具合があった場合はそこで例外エラーが発生するので仕様にあった適切な処理をおこなうことができます。

以上、sqlite3で1行のINSERT文で複数のデータを挿入する方法でした。

タイトルとURLをコピーしました