ゆっくりPython

PythonからSQLite3を叩いてみたよ。とりあえず覚えたのは以下のもの。

  • connect() で接続
  • conn.execute() でクエリを実行
  • 持ってきたクエリを for や fetchone()、fetchall() で取り出して
  • conn.close() でDBを閉じる
  • 結果はカーソルで返ってくる → cursor.fetchXXX() でタプル(?)が返ってくる
import sqlite3

# DBへ接続、DDL、あとinsert
conn = sqlite3.connect('/tmp/test.db')
conn.execute("create table users (name string, age integer)")
conn.execute("insert into users (name, age) values (?, ?)", ("thata", 18))
conn.execute("insert into users (name, age) values (?, ?)", ("ayase haruka", 24))

# もってきた結果セットを for でぐるぐる回す
result = conn.execute("select * from users")
for user in result:
    print "name: %s, age: %d" % (user[0], user[1])
[OUT] name: thata, age: 18
[OUT] name: ayase haruka, age: 24

# もってきた結果セットを fetchall() で配列化し、そのあと for でぐるぐる回す
users = conn.execute("select * from users").fetchall()
for user in users:
    print "name: %s, age: %d" % (user[0], user[1])
[OUT] name: thata, age: 18
[OUT] name: ayase haruka, age: 24

# ひとつだけ取り出す場合には fetchone()
user = conn.execute("select * from users where name = ?", ("thata", )).fetchone()
print "name: %s, age: %d" % (user[0], user[1])
[OUT] name: thata, age: 18

# コネクションを閉じる
conn.close()

"attempt to write a readonly database" エラー

"attempt to write a readonly database" なるエラーに悩まされた。最初はDBがロックしてるんだろうと思ってたんだけど、なんか違うの。手元のPythonスクリプトだと問題ないのにCGIから叩くとこのエラーが出るの。で、いろいろ調べた結果、書き込み権限のせいでCGIを実行してるユーザからはデータベースファイルと配置ディレクトリへの読み書きができないことが原因でしたとさ。

参考:http://it.kndb.jp/entry/show/id/1714
http://d.hatena.ne.jp/dayflower/20070123/1169546863