Python

PythonでSQLiteを使ってデータベースを「作成」「追加」「削除」する方法

By 2021年9月25日No Comments

この記事ではPythonでSQLiteを使ってデータベースに接続し利用する方法について解説します。

Pythonでは多くの種類のデータベースを利用することができますが今回はその中の一つであるSQLiteをPythonで使っていきます。

SQLiteはSQLの中でも比較的に小規模なデータ向けのデータベースになります。PythonでSQLiteを使うには標準ライブラリのsqlite3をインポートします。

import sqlite3

Pythonでデータベースを作成する方法

データベース内ではフィールド(列)とレコード(行)から構成されるテーブル(表)を用いてデータが保存されています。今回はサンプルのデータベースとして下記のデータベースを作成します。

テーブル名:users

idnameage
1ヤマダ30
2タナカ32
3ウエダ26

テーブル名が「users」で「id」「 name」「 age」がそれぞれフィールドになります。それらのフィールドにある各データがレコードです。まずはPythonのsqlite3でデータベースのファイルを作成して上記のようなテーブルのフィールドが格納されてるレコードのデータベースを作成していきます。

import sqlite3

#データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

#テーブルの作成
c.execute('''CREATE TABLE users(id real, name text, age text)''')

#データの挿入
c.execute("INSERT INTO users VALUES (1, 'ヤマダ', '30')")
c.execute("INSERT INTO users VALUES (2, 'タナカ', '32')")
c.execute("INSERT INTO users VALUES (3, 'ウエダ', '26')")

#保存(コミット)する
conn.commit()

#データベースへの接続を終了する
conn.close()

データベースを作成する事ができました。connect( )メソッドを用いてファイル名を指定しています。

そして、execute( )メソッドの引数にSQLコマンドでテーブル名やフィールドを設定してinsert文を使ってレコードを作成しています。最後にconn.close( )でデータベースの接続を終了しています。

データベース内の全てのレコード取得をしていきます。SQL文の構文は下記になります。

SELECT フィールド名 FROM テーブル名

今回は全てのフィールドを取得するのでフィールド名は「*」を指定しています。「*」をSELECTで指定すると全てのデータを取得する事ができます。そして、FROMの後にテーブル名を指定することでテーブル内のデータを呼び出しています。テーブル内の全てのレコードをfetchall( )メソッドを使用してコンソール画面に出力します。

import sqlite3

# データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

sql = """SELECT * FROM users"""
c.execute(sql)

#全レコードを取り出す
print(c.fetchall())

#保存(コミット)する
conn.commit()

#データベースへの接続を終了する
conn.close()

出力結果:

[(1.0, 'ヤマダ', '30'), (2.0, 'タナカ', '32'), (3.0, 'ウエダ', '26')]

テーブル内のデータを取得してfetchall( )メソッドを使用してコンソール画面にレコードを出力する事ができました。

テーブル内のレコードはfor文で一つずつ取得する事ができます。

import sqlite3

# データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

# レコードを生年月日の降順で取得する
for row in c.execute('SELECT * FROM users age'):
    print(row)

#データベースへの接続を終了する
conn.close()

出力結果:

(1.0, 'ヤマダ', '30')
(2.0, 'タナカ', '32')
(3.0, 'ウエダ', '26')

SQLコマンドのORDER BYを使い「age」を指定すると年齢が若い順にレコードを取得する事ができます。

import sqlite3

# データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

# レコードを生年月日の降順で取得する
for row in c.execute('SELECT * FROM users ORDER BY age'):
    print(row)

#データベースへの接続を終了する
conn.close()

出力結果:

(3.0, 'ウエダ', '26')
(1.0, 'ヤマダ', '30')
(2.0, 'タナカ', '32')

このようにSQLコマンドで取得する条件を変更する事ができます。

作成したテーブル名称を変更する事もできます。構文は下記になります。

ALTER TABLE 変更前のテーブル名 RENAME TO 変更後のテーブル名

import sqlite3

#データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

sql = """ALTER TABLE users RENAME TO example"""

conn.execute(sql)

#保存(コミット)する
conn.commit()

#データベースへの接続を終了する
conn.close()

テーブルの名前を「users」から「example」に変更する事ができました。

Pythonでデータベース内のレコードを追加する方法

SQLコマンドのVALUES( )の引数「?」を指定して値を受け取りレコードをexecute( )メソッドで追加できます。

import sqlite3

#データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

sql = """INSERT INTO example VALUES(?, ?, ?)"""

#挿入するレコードを指定
data = ((4, 'キムラ', 20))

c.execute(sql, data)
c.execute('SELECT * FROM example age')
print(c.fetchall())

#データベースへの接続を終了する
conn.close()

出力結果:

[(1.0, 'ヤマダ', '30'), (2.0, 'タナカ', '32'), (3.0, 'ウエダ', '26'), (4.0, 'キムラ', '20')]

テーブルにレコードを複数追加するにはexecutemany( )メソッドを使用します。

import sqlite3

# データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

sql = """INSERT INTO example VALUES(?, ?, ?)"""

#挿入するレコードを指定
data = [
    (5, "Yamada", 10),
    (6, "Tanaka", 19),
    (7, "Ueda", 15),
]

#複数のデータを追加する
c.executemany(sql, data)

c.execute('SELECT * FROM example')
print(c.fetchall())

#保存(コミット)する
conn.commit()

#データベースへの接続を終了する
conn.close()

出力結果:

[(1.0, 'ヤマダ', '30'), (2.0, 'タナカ', '32'), (3.0, 'ウエダ', '26'), (5.0, 'Yamada', '10'), (6.0, 'Tanaka', '19'), (7.0, 'Ueda', '15')]

このようにデータベースのレコードを追加していく事ができました。

Pythonでデータベースのレコードを削除する方法

データベースのレコードを削除します。削除の場合はSQLコマンドのはDELETEを使いwhereの後に消したいデータの条件を指定します。SQLコマンドの構文は下記になります。

DELETE FROM テーブル名 WHERE 削除するデータ

import sqlite3

# データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()
c.execute('DELETE FROM example WHERE id=?', (3,))

#保存(コミット)する
conn.commit()

c.execute('select * from example')
print(c.fetchall())

#データベースへの接続を終了する
conn.close()

出力結果:

[(1.0, 'ヤマダ', '30'), (2.0, 'タナカ', '32'), (5.0, 'Yamada', '10'), (6.0, 'Tanaka', '19'), (7.0, 'Ueda', '15')]

このテーブルの1行目の要素はidなのでidが3の「(3.0, ‘ウエダ’, ’26’)」を指定して削除しました。

テーブルを削除する事もできます。構文は下記になります。

DROP TABLE IF EXISTS テーブル名

import sqlite3

#データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

sql = """DROP TABLE IF EXISTS users"""

conn.execute(sql)

#保存(コミット)する
conn.commit()

テーブルが削除されました。テーブルが削除されているのでSQL文のselectで参照してみるとエラーがでます。

import sqlite3

#データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

c.execute('select * from example')
print(c.fetchall())

出力結果:

c.execute('select * from example')
sqlite3.OperationalError: no such table: example

このように、テーブルが削除されているのが確認できます。

まとめ

Pythonの標準ライブラリのsqlite3を使いデータベースに接続しテーブルの作成やレコードの追加や削除をする事ができました。データベースはテーブルやレコードという単位でデータを扱うことができて項目の型も定義する事ができるので、より厳密にデータを管理することが可能です。以上、PythonでSQLiteを使う方法についてでした。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL