こんにちは🧋
SQLiteはオープンソースの軽量なデータベースです。
今回はPythonでSQLiteを操作する方法をまとめていきます。
使用する基本のメソッド
SQLiteを操作するために、以下のメソッドを使用します。
- sqlite3
.connect(dbname)…SQLiteへ接続
- conn
.cursor()…SQLiteを操作するためにカーソルオブジェクトを作成する。
- cur
.execute(SQL文)…SQL文を実行する。
- conn
.commit()…処理を反映する。
- conn
.close()…SQLiteとの接続を閉じる
データベースとテーブルの作成
試しに、companyというデータベースの中に、employeesテーブルを作って行きたいと思います。
1
2
3
4
5
6
7
8
9
10
|
import sqlite3
dbname = 'company.sqlite3'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute('CREATE TABLE employees(id INT PRIMARY KEY AUTOINCREMENT, name TEXT, age INT, department TEXT)')
conn.commit()
conn.close()
|
これを実行するとデータベースとテーブルが作成できました。
行を挿入する
SQL文をcur.execute()の括弧内に入れることで、各種処理を実行できます。
以下のように、行を挿入してみます。
さきほどの例では文を横一列に書きましたが、'の代わりに'''で囲むことで、複数行にわたって書くことができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import sqlite3
dbname = 'company.sqlite3'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute(
'''
INSERT INTO
employees(name, age, department)
VALUES
("ichiro", 50, "IT")
'''
)
conn.commit()
conn.close()
|
変数を使って行を挿入する
挿入したい値が変数の場合は、SQL文上でその場所を?にしておき、.execute()の第2引数として変数名をいれます。
以下では、departmentという項目に入れる値が、変数deptnameであった時の例です。第2引数はタプルである必要があるので、下記のように値が一つだけの場合は最後に,が必要です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import sqlite3
deptname = "Human Resources"
dbname = 'company.sqlite3'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute(
'''
INSERT INTO
employees(name, age, department)
VALUES
("jiro", 32, ?)
''',
(deptname,)
)
conn.commit()
conn.close()
|
データを取得する
データを取得する時は、カーソルオブジェクト(本記事では変数"cur")に以下のようなメソッドを適用します。
- cur
.fetchone()…条件に一致する行を一つだけ取得
- cur
.fetchall()…条件に一致する全ての行を取得
以下は.fetchall()を使用した例です。
1
2
3
4
5
6
7
8
9
10
11
12
|
import sqlite3
dbname = 'company.sqlite3'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute('SELECT * FROM employees')
print(cur.fetchall())
conn.commit()
conn.close()
|
print結果は以下のようになります。
1
|
[(1, 'ichiro', 50, 'IT'), (2, 'jiro', 32, 'Human Resources')]
|
列名を指定してデータを取得する
コネクションオブジェクトのrow_factory属性をsqlite3.Row型に設定しておくと、列の名前を指定してデータを取得することが可能です。
- conn.row_factory = sqlite3.Row
そしてそのあと、カーソルオブジェクトからデータを取り出す時に、forループで各行の列名を指定します。
- for row in cur:
print(row[“列名”])
使用例は以下の通りです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import sqlite3
dbname = 'company.sqlite3'
conn = sqlite3.connect(dbname)
conn.row_factory = sqlite3.Row
cur = conn.cursor()
cur = conn.execute('SELECT * FROM employees')
for row in cur:
print(row["name"])
conn.close()
|
print結果は以下のようになりました。
参考リンク
docs.python.orgに詳細な記載があります。
sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース