Top / Programming / Python / Python Tips / SQLite3を使用する

SQLite3を使用する

軽量・高速なデータベースSQLiteをPythonから扱うためのライブラリ。

インストール

Python2.5から標準ライブラリに入りました。
インストール作業は不要です。

使用方法

sqlite3をインポートする

#!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)

関連