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 山梨
PS..
商品番号で0001と出ないなSQLiteの仕様。