初心者でもPythonを使ってみよう

趣味と実益を兼ねたPython学習記



【sqlite3】データベースを作成・更新する方法【python】

f:id:vigilantPotato:20191130230817p:plain

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()

[↑ 目次へ]