PythonでSQLite3を使う

Python2.5以降はsqlite3が標準モジュールとして使えるらしいので、

の問題点の一つである「一度取得した書籍情報を再び取得してしまう」を解決するために、書籍情報を保存するデータベースを生成する。

環境

参考

データベースについては完全な初心者なので、一般知識については、MySQL/PostgreSQLなどデータベースの学習ならDBOnline(移転しました)SQLite入門を見て勉強した。
また、Pythonのsqlite3モジュールの使用法については、http://www.python.jp/doc/2.5/lib/module-sqlite3.htmlSQLite3を使用する - Python Tipsを参考にした。
まだ、勉強し始めたばかりなので上手いデータベースデザインの勘は掴めていないと思うが、

  • メンテナンス性を高く保つ(正規化)
  • アクセス速度を保つ(ディスクアクセス量を出来るだけ減らす)

に注意してアプリケーションにあったデザインを素直に考えれば今のところは大丈夫じゃないかなと思う。普段のプログラミングのクラス設計と似ている部分も多くあるだろう。
というわけで、実際に簡単なサンプルを実装してみた。

データベースの生成

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3

db = sqlite3.connect('data.db', isolation_level=None)
c = db.cursor()

sql = u"""
create table books (
    title varchar(100),
    price integer,
    id integer
);
"""
c.execute(sql)

sql = u"insert into books values ('python', 2000, 1)"
c.execute(sql)

items = ( ('perl', 3000, 2),
          ('ruby', 1500, 3)
        )
for t in items:
    c.execute(u"insert into books values (?,?,?)", t)

sql = u"select * from books"
c.execute(sql)
for record in c:
    print record[0], record[1], record[2]

db.close()

データベースからレコードの取得

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3

db = sqlite3.connect('data.db')

c = db.cursor()
sql = u"select * from books"
c.execute(sql)
for record in c:
    print record[0], record[1], record[2]

db.close()

基本的には、

  1. connect関数で対象のデータベースと接続したConnectionオブジェクトが返る
  2. ConnectionオブジェクトのcursorメソッドでCursorオブジェクトが返る
  3. CursorオブジェクトのexecuteメソッドでSQL文を実行し、結果が返る

これだけ分かっていれば、とりあえずデータベースの操作はできそうだ。
SQLite3を使用する - Python TipsではConnectionオブジェクトに対してテーブルの生成やレコードの追加を行っていたが、http://www.python.jp/doc/2.5/lib/module-sqlite3.htmlではCursorオブジェクトに対して行っている。両者の違いについて調べたところ、

Connection オブジェクトの非標準的なメソッド execute, executemany, executescript を使うことで、 (しばしば余計な) Cursor オブジェクトをわざわざ作り出さずに済むので、 コードをより簡潔に書くことができます。Cursor オブジェクトは暗黙裡に 生成されショートカットメソッドの戻り値として受け取ることができます。この方法を 使えば、 SELECT 文を実行してその結果について反復することが、 Connection オブジェクトに対する呼び出し一つで行なえます。

http://www.python.jp/doc/2.5/lib/node353.html

ということらしい。つまり、Connectionオブジェクトのexecuteメソッドは名無しのCursorオブジェクトを勝手に生成してSQL文を実行してくれるショートカットで、ソースコードの簡略化が目的らしい。そこまで深く考える必要はなかったようだ。
次回は、実際にAmazonのProduct Advertising APIを使ってISBNから書籍情報を取得する - 脳みそHackと組み合わせてみる。複数のテーブルを持つデータベースの作成も行いたい。