前回に引き続きSQLiteの話です。Windows環境のPythonからSQLiteを操作します。
前回はデータベースの作成、テーブルの作成・一覧取得・削除を行いました。
今回は、既存のテーブルに対してレコード(データ)を操作します。
目次
テーブルからレコードを取得する
前回の内容を踏まえて、すでに”hoge.db”というデータベースに、”users”というテーブルがあるものとします。テーブルのレコードをすべて読み込むプログラムは下記のとおりです。
import sqlite3
# SQLiteデータベースに接続する(ない場合は作られる)
dbname = 'C:/SQLite/hoge.db'
conn = sqlite3.connect(dbname)
# テーブルからレコードを取得する
sql = "SELECT id, name, age FROM users"
cursor = conn.execute(sql)
for row in cursor:
print("id:", row[0], ", name:", row[1], ", age:", row[2])
# データベースを閉じる
conn.close()
ターミナルにはすべてのレコードが表示されます。
また、下記のようなプログラムでもレコードの一覧を取得できます。
import sqlite3
# SQLiteデータベースに接続する(ない場合は作られる)
dbname = 'C:/SQLite/hoge.db'
conn = sqlite3.connect(dbname)
# row_factoryにsqlite3.Rowを設定
conn.row_factory = sqlite3.Row
# カーソルオブジェクトを取得する
cur = conn.cursor()
sql = 'select * from users'
cur.execute(sql)
for row in cur:
# カラム名でアクセスすることができる。
print(row['id'],row['name'],row['age'])
# カーソルオブジェクトを閉じる
cur.close()
# データベースを閉じる
conn.close()
テーブルにレコードを追加する
テーブルにレコードを追加するプログラムは下記のとおりです。
import sqlite3
# SQLiteデータベースに接続する(ない場合は作られる)
dbname = 'C:/SQLite/hoge.db'
conn = sqlite3.connect(dbname)
# sqliteを操作するカーソルオブジェクトを作成
cur = conn.cursor()
# レコードを追加する
# すでに"users"というテーブルがあるものとする
sql = "INSERT INTO users (id, name, age) VALUES (1, 'Alice', 25)"
cur.execute(sql)
# レコードを取得する
sql = "SELECT id, name, age FROM users"
cur.execute(sql)
for row in cur:
print("id:", row[0], ", name:", row[1], ", age:", row[2])
# データベースへコミット。これで変更が反映される。
conn.commit()
# カーソルオブジェクトを閉じる
cur.close()
# データベースを閉じる
conn.close()
先ほどのテーブルのレコード一覧を取得するスクリプトを組み込んでいますので、追加したレコードがターミナルに表示されます。
テーブルにレコードを複数追加する
テーブルに複数のレコードを追加する場合はどうすればいいでしょうか。以下のようにレコードの数だけ追加操作を繰り返してもよいですが、追加したいレコードの数が増えると可読性が低下します。
import sqlite3
# SQLiteデータベースに接続する(ない場合は作られる)
dbname = 'C:/SQLite/hoge.db'
conn = sqlite3.connect(dbname)
# データを追加する
# すでに"users"というテーブルがあるものとする
sql = "INSERT INTO users (id, name, age) VALUES (1, 'Alice', 25)"
cur.execute(sql)
sql = "INSERT INTO users (id, name, age) VALUES (2, 'Bob', 30)"
cur.execute(sql)
sql = "INSERT INTO users (id, name, age) VALUES (3, 'Charlie', 35)"
cur.execute(sql)
# データを取得する
sql = "SELECT id, name, age FROM users"
cur.execute(sql)
for row in cur:
print("id:", row[0], ", name:", row[1], ", age:", row[2])
# データベースへコミット。これで変更が反映される。
conn.commit()
# カーソルオブジェクトを閉じる
cur.close()
# データベースを閉じる
conn.close()
“executemany”メソッドでテーブルにレコードを複数追加する
executemanyメソッドを使うことで、複数のレコードを一括して挿入することができます。
import sqlite3
# SQLiteデータベースに接続する(ない場合は作られる)
dbname = 'C:/SQLite/hoge.db'
conn = sqlite3.connect(dbname)
# 複数のレコードを一括して挿入するには、executemany()メソッドにinsert文を渡します。
sql = 'insert into users (id, name, age) values (?,?,?)'
data = [(1, 'Alice', 25),
(2, 'Bob', 30),
(3, 'Charlie', 35)]
cur.executemany(sql, data)
# レコードを取得する
sql = "SELECT id, name, age FROM users"
cur.execute(sql)
for row in cur:
print("id:", row[0], ", name:", row[1], ", age:", row[2])
# データベースへコミット。これで変更が反映される。
conn.commit()
# カーソルオブジェクトを閉じる
cur.close()
# データベースを閉じる
conn.close()
テーブルからレコードを削除する
テーブルからレコードを削除する場合は、キーで指定します。今回は主キーである”id”の値でレコードを指定します。
import sqlite3
# SQLiteデータベースに接続する(ない場合は作られる)
dbname = 'C:/SQLite/hoge.db'
conn = sqlite3.connect(dbname)
# sqliteを操作するカーソルオブジェクトを作成
cur = conn.cursor()
# レコードの削除
# "id"が"1"のレコードを削除
sql = "DELETE from users where id = "1""
cur.execute(sql)
# コミット
db.commit()
# カーソルオブジェクトを閉じる
cur.close()
# データベースを閉じる
conn.close()
テーブルから全てのレコードを削除する
以下のようにキーを指定しなかった場合、テーブルから全てのレコードが削除されます。
import sqlite3
# SQLiteデータベースに接続する(ない場合は作られる)
dbname = 'C:/SQLite/hoge.db'
conn = sqlite3.connect(dbname)
# sqliteを操作するカーソルオブジェクトを作成
cur = conn.cursor()
# レコードの削除
# 全てのレコードを削除する
sql = "DELETE from users"
cur.execute(sql)
# コミット
db.commit()
# カーソルオブジェクトを閉じる
cur.close()
# データベースを閉じる
conn.close()
“TRUNCATE”メソッドでテーブルから全てのレコードを削除する
以下のようにTRUNCATEメソッドを使うことで、DELETEよりも高速に削除することができます。
import sqlite3
# SQLiteデータベースに接続する(ない場合は作られる)
dbname = 'C:/SQLite/hoge.db'
conn = sqlite3.connect(dbname)
# sqliteを操作するカーソルオブジェクトを作成
cur = conn.cursor()
# レコードの削除
# 全てのレコードを削除する
sql = "TRUNCATE table users"
cur.execute(sql)
# コミット
db.commit()
# カーソルオブジェクトを閉じる
cur.close()
# データベースを閉じる
conn.close()