
pythonの組み込みモジュールであるsqlite3を用いてデータベースを作成する方法をまとめました。
【スポンサーリンク】
データベースを作成する
データベースはテーブル(表)で構成され、テーブルはフィールド(項目、列)とレコード(行)で構成されます。
データベースを作成するには、①データベースファイルの作成、②テーブル(表)とその項目であるフィールドの登録、③具体的なデータであるレコードの登録という順番で進めていきます。
データベースファイルを作成する
データベースファイルを作成するために、sqlite3モジュールをインポートしてのconnectメソッドを実行し、データベース接続用オブジェクトを生成します。
引数にデータベース名を入れて実行すると、データベースファイルが存在しない場合は新規で作成され、すでに存在する場合はそのファイルが読み込まれます。
import sqlite3 db = sqlite3.connect("test.db", isolation_level=None)
このコマンドを実行するとtest.dbが自動で作成されます。また、引数にisolation_level = None
が追加されているため、この後にデータベースに命令文を渡した際、命令が自動で実行されるようになります。isolation_level = None
を設定しないと、命令をデータベースに渡しても自動では実行されません。その場合は別途実行のコマンド(commit)を実行する必要があります。
dbはデータベース接続用オブジェクトで、このオブジェクトのexecuteメソッドにSQL命令文を渡すことで、テーブルの作成やレコードの登録をすることができます。
テーブル・フィールドを作成する
例として、フルーツを管理するためのテーブルを作成していきます。管理する項目(フィールド)は、フルーツのID番号(id)、フルーツ名(name)、価格(price)とします。
データベースにテーブルとフィールドを作成するには、データベース接続用オブジェクトのexecuteメソッドに以下の様なSQL文(文字列)を渡します。
#SQL命令文(テーブル作成) sql = """ CREATE TABLE Fruit ( id INTEGER, name VARCHAR(20), price INTEGER ); """ #命令を実行 db.execute(sql)
この例では、テーブル名Fruitの中に、フィールド名id、name、priceを作成しています。idとpriceは整数(INTEGER)で、nameは20字以内の可変長文字列(VARCHAR)を指定しています。
レコードを登録する
データベースにレコードを登録(挿入)するには、データベース接続用オブジェクトのexecuteメソッドに以下の様なSQL文(文字列)を渡します。
#SQL命令文(レコード挿入) sql = """ INSERT INTO Fruit VALUES ( 1, 'banana', 138 ) """ #命令を実行 db.execute(sql)
この例では、id:1、name:banana、price:138のレコードを登録しています。
レコードを取得する
データベースオブジェクトのcursorメソッドでカーソルを取得し、カーソルのexecuteメソッドに以下の様なSQL命令文を渡すことでレコードを取得することができます。
以下の例では、先ほど作成したFruitテーブル内のレコードを取得しています。
#SQL命令文(Fruitテーブル内のレコードを全て取得) sql = "SELECT * FROM Fruit" #カーソルを取得して命令を実行 c = db.cursor() c.execute(sql)
取得したレコードは、for文等を用いて表示することができます。
#レコードの表示 for row in c: print(row)
上記のコードを実行すると、レコードがタプルで出力されます。
(1, 'banana', 138)
データベースを閉じる
データベースの処理が完了したら、データベースを閉じる必要があります。
データベース接続用オブジェクトのcloseメソッドを実行して、データベースを閉じます。
#データベースを閉じる
db.close()
コード全体
import sqlite3 db = sqlite3.connect("test.db", isolation_level=None) #SQL命令文(テーブル作成) sql = """ CREATE TABLE Fruit ( id INTEGER, name VARCHAR(20), price INTEGER ); """ #命令を実行 db.execute(sql) #SQL命令文(レコード挿入) sql = """ INSERT INTO Fruit VALUES ( 1, 'banana', 138 ) """ #命令を実行 db.execute(sql) #SQL命令文(Fruitテーブル内のレコードを全て取得) sql = "SELECT * FROM Fruit" #カーソルを取得して命令を実行 c = db.cursor() c.execute(sql) #レコードの表示 for row in c: print(row) #データベースを閉じる db.close()
【スポンサーリンク】
データベースを更新する
作成したデータベースのレコードを追加、削除、更新する方法をまとめました。
事前に以下のコードを実行して先ほど作成したデータベースに接続するオブジェクトを生成しておきます。
import sqlite3 db = sqlite3.connect("test.db", isolation_level=None)
レコードを一括で登録する
データベースのFruitテーブルに、「id:2、name:apple、price:105」と「id:3、name:orange、price:198」の二つのレコードを一括で登録していきます。
一括で登録したいレコードを、以下の様に配列にしておきます。
r = [(2, "apple", 105), (3, "orange", 198)]
レコードを一つだけ登録する際はexecuteメソッドを使用していましたが、複数のレコードを一括で登録するには、executemanyメソッドを使用します。executemanyメソッドを使用する際は、SQL命令文は以下の通りになります。
#SQL命令文(一括登録) sql = """ INSERT INTO Fruit VALUES ( ?, ?, ? )
最後に、executemanyメソッドにSQL命令文と登録するレコードの配列を渡すことで、複数のレコードを一括で登録することができます。
db.executemany(sql, r)
以上のコードを実行した後にデータベースのレコードを表示させると、以下の様に出力されます。
(1, 'banana', 138) (2, 'apple', 105) (3, 'orange', 198)
複数のレコードを一括で登録できていることが確認できます。
レコードを削除する
データベースのFruitテーブルから、id:2の項目を削除してみます。
レコードを削除するSQL命令文は以下の通りになります。
#SQL命令文(レコードの削除) sql = """DELETE FROM Fruit WHERE id=2"""
このSQL命令文をexecuteメソッドに渡して実行すると、条件に当てはまるレコードがテーブルから削除されます。
#命令を実行
db.execute(sql)
以上のコードを実行した後にデータベースのレコードを表示させると、以下の様に出力されます。
(1, 'banana', 138) (3, 'orange', 198)
id:2の項目が削除されたことが確認できます。
レコードを更新する
id:1のレコードについて、priceの値を150に修正してみます。
レコードのデータを変更するSQL命令文は以下の通りになります。
#SQL命令文(レコードの更新) sql = """UPDATE Fruit SET price=150 WHERE id=1"""
このSQL命令文をexecuteメソッドに渡して実行すると、id:1のレコードのpriceが150に更新されます。
#命令を実行
db.execute(sql)
以上のコードを実行した後にデータベースのレコードを表示させると、以下の様に出力されます。
(1, 'banana', 150) (3, 'orange', 198)
id:1のレコードのpriceが150に更新されていることが確認できます。
コード全体
import sqlite3 def show_record(): #SQL命令文(Fruitテーブル内のレコードを全て取得) sql = "SELECT * FROM Fruit" #カーソルを取得して命令を実行 c = db.cursor() c.execute(sql) #レコードの表示 for row in c: print(row) db = sqlite3.connect("test.db", isolation_level=None) #レコードの表示 print("レコード初期状態") show_record() #登録するレコード r = [(2, "apple", 105), (3, "orange", 198)] #SQL命令文(一括登録) sql = """ INSERT INTO Fruit VALUES ( ?, ?, ? ) """ #命令を実行 db.executemany(sql, r) #レコードの表示 print("レコード一括登録") show_record() #SQL命令文(レコードの削除) sql = """DELETE FROM Fruit WHERE id=2""" #命令を実行 db.execute(sql) #レコードの表示 print("レコード削除") show_record() #SQL命令文(レコードの更新) sql = """UPDATE Fruit SET price=150 WHERE id=1""" #命令を実行 db.execute(sql) #レコードの表示 print("レコード更新") show_record() #データベースを閉じる db.close()