# 13 `sqlite3` -- SQLite データベースに対する DB-API 2.0 インタフェース

バージョン 2.5 で 新たに追加 された仕様です。

SQLite は、別にサーバプロセスは必要とせずデータベースのアクセスに SQL 問い合わせ言語の非標準的な一種を使える軽量なディスク上のデータベースを 提供する C ライブラリです。ある種のアプリケーションは内部データ保存 に SQLite を使えます。また、SQLite を使ってアプリケーションのプロトタイ プを作りその後そのコードを PostgreSQL や Oracle のような大規模データベー スに移植するということも可能です。

pysqlite は Gerhard Häring によって書かれ、PEP 249 に記述され た DB-API 2.0 仕様に準拠したSQL インタフェースを提供するものです。

このモジュールを使うには、最初にデータベースを表す `Connection` オブジェクトを作ります。ここではデータはファイル /tmp/example に 格納されているものとします。

    conn = sqlite3.connect('/tmp/example')

特別な名前である "`:memory:`" を使うと RAM 上にデータベースを作るこ ともできます。

`Connection` があれば、 `Cursor` オブジェクトを作りそ の `execute()` メソッドを呼んで SQL コマンドを実行することができ ます。

    c = conn.cursor()

    # Create table
    c.execute('''create table stocks
    (date text, trans text, symbol text,
     qty real, price real)''')

    # Insert a row of data
    c.execute("""insert into stocks
              values ('2006-01-05','BUY','RHAT',100,35.14)""")

たいてい、SQL 操作は Python 変数の値を使う必要があります。この時、クエ リーを Python の文字列操作を使って構築することは、安全とは言えないので、 すべきではありません。そのようなことをするとプログラムが SQL インジェク ション攻撃に対し脆弱になりかねません。

代わりに、DB-API のパラメータ割り当てを使います。"`?`" を変数の値を 使いたいところに埋めておきます。その上で、値のタプルをカーソル の `execute()` メソッドの第2引数として引き渡します。(他のデータ ベースモジュールでは変数の場所を示すのに"`%s`" や "`:1`" などの 異なった表記を用いることがあります。) 例を示します。

    # Never do this -- insecure!
    symbol = 'IBM'
    c.execute("... where symbol = '%s'" % symbol)

    # Do this instead
    t = (symbol,)
    c.execute('select * from stocks where symbol=?', t)

    # Larger example
    for t in (('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
              ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
              ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
             ):
        c.execute('insert into stocks values (?,?,?,?,?)', t)

SELECT 文を実行した後データを取得する方法は3つありどれを使っても構いま せん。一つはカーソルをイテレータとして扱う、一つはカーソル の `fetchone()` メソッドを呼んで一致した内の一行を取得する、もう 一つは `fetchall()` メソッドを呼んで一致した全ての行のリストとし て受け取る、という3つです。

以下の例ではイテレータの形を使います。

    >>> c = conn.cursor()
    >>> c.execute('select * from stocks order by price')
    >>> for row in c:
    ...    print row
    ...
    (u'2006-01-05', u'BUY', u'RHAT', 100, 35.140000000000001)
    (u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)
    (u'2006-04-06', u'SELL', u'IBM', 500, 53.0)
    (u'2006-04-05', u'BUY', u'MSOFT', 1000, 72.0)
    >>>

参考:

http://www.pysqlite.org
  pysqlite のウェブページ

http://www.sqlite.org
  SQLite のウェブページ。 ここの文書ではサポートされる SQL 方言の文法と使えるデータ型を説明しています

PEP 249, Database API Specification 2.0
  Marc-André Lemburg により書かれた PEP

http://www.python.jp/doc/contrib/peps/pep-0249.txt
  訳注: PEP 249 の日本語訳があります