PythonでSQLiteと戯れてみる

TurboGearsを使うに当たってO/Rマッパーをつかうから、
SQLのドライバレベルのローレベルなことは知る必要性は全くないのですが、
本当に全く知らないとデバッグで苦労する(はず??)ので、
DBAPIを使ったPythonプログラミングを軽く練習しておきます。
あと、意外にpysqlite に関する記述が少なかったのでまとめてみた。
下環

  • Gentoo Linux 2006.1 ←(ちょっと古い(^^;)
  • Python2.4.3
  • SQLite 3.3.5 (Python2.5では標準モジュールとしてsqlite3という名前である)
  • pysqlite 2.3.1


以下のテーブルを作って操作してみる。

商品番号 商品 値段 産地
0001 リンゴ 200 青森
0002 みかん 300 愛媛
0003 バナナ 150 フィリピン
0004 メロン 700 北海道
0005 ブドウ 500 山梨

まずはSQLiteの下準備

% sqlite3 pytest.db
SQLite version 3.3.5
Enter ".help" for instructions
sqlite> create table sampleTable(
   ...> id integer PRIMARY KEY AUTOINCREMENT,
   ...> name text,
   ...> cost integer,
   ...> area text);
sqlite> .table
sampleTable
sqlite> .schema sampleTable
CREATE TABLE sampleTable(
id integer PRIMARY KEY AUTOINCREMENT,
name text,
cost integer,
area text);
sqlite> insert into sampleTable values(null, "リンゴ", 200, "青森");
sqlite> select * from sampleTable;
1|リンゴ|200|青森

pysqliteモジュールを使ってPythonからSQLiteに接続

ファイルなら
from pysqlite2 import dbapi2 as sqlite
con = sqlite.connect("pytest.db") // SQLiteに接続
cur = con.cursor()  // カーソルの取得
メモリ上にDBを築くなら
from pysqlite2 import dbapi2 as sqlite
con = sqlite.connect(":memory:") // SQLiteに接続
cur = con.cursor()  // カーソルの取得

データベースから値の取得

% python
Python 2.4.3 (#1, Jun 26 2007, 15:32:40) 
[GCC 4.1.1 (Gentoo 4.1.1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pysqlite2 import dbapi2 as sqlite
>>> con = sqlite.connect("pytest.db")
>>> cur = con.cursor()
>>> 
>>> cur.execute("select * from sampleTable")
<pysqlite2.dbapi2.Cursor object at 0xb7ca3620>
>>> print cur.fetchall()
[(1, u'\u30ea\u30f3\u30b4', 200, u'\u9752\u68ee')]

データベースに値を登録

insert.py ソース
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pysqlite2 import dbapi2 as sqlite

con = sqlite.connect("pytest.db")
cur = con.cursor()

postData = (
  ( "みかん", 300, "愛媛"),
  ( "バナナ", 150, "フィリピン"),
  ( "メロン", 700, "北海道"),
  ( "ブドウ", 500, "山梨"),
)

for data in postData:
        cur.execute("insert into sampleTable values(null,?,?,?)" , data)

# こっちの書き方でもOK
#cur.execute("insert into sampleTable value(null,?,?,?)", postData)

for val in cur.execute("select * from sampleTable"):
	print "%04d" % val[0], val[1], val[2],val[3]

con.commit()
結果
% python insert.py 
0001 リンゴ 200 青森
0002 みかん 300 愛媛
0003 バナナ 150 フィリピン
0004 メロン 700 北海道
0005 ブドウ 500 山梨

まとめ

パラッパラパッパ〜〜♪
みのるはpythonからpysqliteを利用してSQLiteとおしゃべりができるようになった。

PS..

商品番号で0001と出ないなSQLiteの仕様。

[補足]PythonSQLiteのType変換

PythonSQLiteの間では暗黙の型変換が行われる

PythonSQLite の変換
Python type SQLite type
None Type NULL
int INTEER
int INTEGER
long INTEGER
float REAL
str (utf-8 encoded) TEXT
unicode TEXT
buffer BLOB
SQLitePython type
SQLite type Python type
NULL NoneType
INTEGER int or long, depending on size
REAL float
TEXT unicode
BLOB buffer