Python3でSQLite3を使う – 基本操作からエラー処理までサンプルコード付

WEBのシステム開発はPHPを使用していますが、データ解析等のため Python3 の研究を始めました。Python3 は日本語の情報がとても少ないので、エンジニアや学生の皆さんに役立ちそうなことをブログ記事として共有できればと思います。

この記事では Python3 で SQLite3 に接続する方法、エラー処理(例外処理)、サンプルによるCRUD(※)、PHPer向け注意点についてまとめました。なおサンプルは Django 等、特定フレームワークの ORM ではなく、SQLの直接実行例です。

MySQL は Python3でMySQLを使う – 基本操作からエラー処理までサンプルコード付を参照ください。

※ CRUD とは Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)の略です。SQLite の場合Read に相当するのは主に Select 文になります。

Python3 で SQLite3 を使うための準備

MySQL の場合にはパッケージをインストールする必要がありましたが、SQLite3 はPython3にはじめから組み込まれている標準モジュールがあるため、とくに何もすることはありません。

関連する公式ページ
http://docs.python.jp/3.5/library/sqlite3.html

では CRUD の操作をみていきます。

接続 / CREATE / INSERT

接続からテーブル作成・データ挿入まで、よくある操作をサンプルコードにまとめてみました。

ポイント解説

エラー処理

SQLite3 の操作上のエラーは sqlite3.Error により処理できます。データベースの操作に予期せぬエラーはつきものなので、必ず例外処理をしておきましょう。上のサンプルソースでもわざと不正なSQLを実行して例外を発生させています。

プレースホルダ

プレースホルダには疑問符(qmark スタイル)と名前(named スタイル)の2つの方法があります(上のサンプルコードを参照)。PHP の PDO や SQLite3 と同じですね。

PHPer 向け注意事項

PHP の PDO や SQLite3 は INSERT / UPDATE / DELETE 文の実行と同時にデータの更新が行われますが、Python3 の sqlite3 モジュールでは(上のサンプルコードの最終行のように)必ずコミットをする必要があります。connection.commit() を忘れるとデータが保存されないことに注意しましょう。

カーソル生成前に connection.isolation_level = None を設定することで PHP と同様の動作にすることもできますが、郷に入れば郷に従えです。

SELECT

SELECT文を使ってよくやることをまとめてみました。件数取得、全件データ取得、1件データ取得、WHERE句など大抵のことは下記サンプルでわかるかと思います。

ポイント解説

カーソルオブジェクトの rowcount プロバティーは SELECT 文の件数取得には使えないことに注意しましょう。サンプルのように len() を使います。

全件をループする方法は上のコードのように「イテレータ」と「fetchall()メソッド」による2パターンがあります。どちらのパターンも覚えておきましょう。

PHPer 向け – 辞書型(連想配列)で取得するには?

PHP の PDO や SQLite3 の場合、結果セットは $row[‘name’] のように連想配列で受け取れますが、cursor.fetchone() , cursor.fetchall() ともに結果セットは 0 で始まる単純な配列(正確にはタプルというデータ型)になっています。PDO::FETCH_NUM, SQLITE3_NUM と同じ挙動です。

row[0], row[1] ではなく、row[‘id’], row[‘name’] のように結果セットを連想配列(Python では辞書型と呼びます)で受け取りたいケースも多いかと思います。

http://docs.python.jp/3.5/library/sqlite3.html#sqlite3.Connection.row_factory
上記公式ドキュメントのように辞書型で受け取る方法は2パターンで、どちらでも row[‘id’], row[‘name’] にて受け取れるようになります。

1. row_factory に sqlite3.Row を設定

コネクションオブジェクトの row_factory プロパティーに sqlite3.Row セットする方法です。一行で済むのでオススメです。

2. row_factory に 独自実装の辞書を設定

コネクションオブジェクトの row_factory プロパティーに独自実装の辞書をセットする方法です。

UPDATE / DELETE

UPDATE と DELETE には特別なことはありません。上の INSERT と同様にコミットしないと変更が保存されないこと、適宜 sqlite3.Error で例外処理をすることを忘れないようにしましょう。

以上、Python3 で SQLite を使う方法をまとめてみました。インターフェースこそ MySQL と SQLite で同様ですが、プレースホルダやSELECT結果の件数取得など細かい使い方が異なっているので注意しましょう。

※弊社の専門はPHP言語なので、おかしなところがあればご指摘ください。
※この記事の内容は適宜更新することがあります。