軽量・高速なデータベースSQLiteをPythonから扱うためのライブラリ。
Python2.5から標準ライブラリに入りました。
インストール作業は不要です。
#!python2.6
# -*- coding: utf-8 -*-
import sqlite3
con = sqlite3.connect("data.db")
isolation_levelにNoneを指定すると、自動コミットモードになります。
con = sqlite3.connect('temp.db', isolation_level=None)
特別な名前である ":memory:" を使うとRAM上にデータベースを作ることもできます。
con = sqlite3.connect(":memory:")
con.close()
String型の「氏名」フィールド、 Integer型の「年齢」フィールド、 String型の「部署」フィールド、を持つ「社員」テーブルを作成する。
sql = u"""
create table 社員 (
名前 varchar(10),
年齢 integer,
部署 varchar(200)
);
"""
con.execute(sql)
使用できるデータ型
レコードを登録する
sql = u"insert into 社員 values ('橋本', 26, '広報部')"
con.execute(sql)
sql = u"insert into 社員 values (?, ?, ?)"
con.execute(sql, (u"小泉", 35, u"営業部"))
con.execute(sql, (u"亀井", 40, u"営業部"))
executemany()メソッドを使用すると、複数のSQL文を一括して実行できます。
con.executemany(u"insert into 社員 values (?, ?, ?)",
[(u"小泉", 35, u"営業部"),
(u"亀井", 40, u"営業部")])
c = con.cursor()
c.execute(u"select * from 社員")
for row in c: # rowはtuple
print row[0], row[1], row[2]
結果
橋本 26 広報部
小泉 35 営業部
亀井 40 営業部
execute()メソッドは、cursor()メソッドのショートカットです。
c = con.execute(u"select * from 社員")
for row in c:
print row[0], row[1], row[2]
結果
橋本 26 広報部
小泉 35 営業部
亀井 40 営業部
con = sqlite3.connect("data.db")
con.row_factory = sqlite3.Row
for row in con.execute(u"select * from 社員"):
print row["名前"], row["年齢"], row["部署"]
カーソルのfetchone()メソッドを呼ぶと一行ずつ値を取得できます。
c = con.execute(u"select * from 社員")
row = c.fetchone()
print row[0], row[1], row[2]
row = c.fetchone()
print row[0], row[1], row[2]
結果
橋本 26 広報部
小泉 35 営業部
カーソルのfetchall()メソッドを呼ぶと残りのすべての行を取得できます。
c = con.execute(u"select * from 社員")
row = c.fetchone()
print row[0], row[1], row[2]
print "---"
for row in c.fetchall():
print row[0], row[1], row[2]
結果
橋本 26 広報部
---
小泉 35 営業部
亀井 40 営業部
#小泉の部署を広報部に更新する
con.execute(u"update 社員 set 部署='広報部' where 名前='小泉'")
# 亀井を削除
con.execute(u"delete from 社員 where 名前='亀井'")
コミットする
con.commit()
ロールバック
con.rollback()
Connectionオブジェクトのisolation_levelをNoneにすると、自動コミットモードになります。
con = sqlite3.connect("data.db")
con.isolation_level = None
または接続時に
con = sqlite3.connect('temp.db', isolation_level=None)