【SQLite3】データの登録・取得・更新・削除

# はじめに
Pythonの標準ライブラリである"sqlite3"の備忘録．

# 動作環境
- Python 3.12.0
- SQLite3モジュール 2.6.0
- SQLite 3.42.0

# コマンド
## データベース作成
```python
import sqlite3

dbFile = 'test.db'
con = sqlite3.connect(dbFile)

con.close()
```
カレントディレクトリに"test.db"が無ければ作成します．すでに"test.db"が作成されていれば，"test.db"に接続します．

## テーブル作成
テーブル作成は以下の手順で行います．

<ins>1. データベースに接続</ins>
<ins>2. カーソルオブジェクトを作成</ins>
<ins>3. テーブルを作成するCREATE文を実行</ins>
<ins>4. データベースに情報をコミット</ins>
<ins>5. データベースの接続を切断</ins>

```python
import sqlite3

dbFile = 'test.db'
# 1.データベースに接続
con = sqlite3.connect(dbFile)

# 2.sqliteを操作するカーソルオブジェクトを作成
cur = con.cursor()

# 3.CREATE文を実行
cur.execute("""CREATE TABLE persons(id, name，gender)""")

# 4.データベースに情報をコミット
con.commit()

# 5.データベースの接続を切断
cur.close()
con.close()
```

テーブルを作成する時の基本となる構文は下記の通りです．
```
CREATE TABLE テーブル名(カラム名1, カラム名2, ...);
```
dbファイルにテーブルが存在しない場合のみ作成するときは，"```IF NOT EXISTS```"を追記します．
```
CREATE TABLE IF NOT EXISTS テーブル名(カラム名1, カラム名2, ...);
```

## テーブルにデータ登録（INSERT文）
テーブルに含まれる全てのカラムに値を指定してデータを追加する場合，以下の構文を使用します．
```
INSERT INTO テーブル名 VALUES(値1, 値2, ...);
```

テーブルに含まれる特定のカラムを指定してデータを追加する場合，以下の構文を使用します．
```
INSERT INTO テーブル名(カラム名) values(値1);
```
以下，サンプルコードです．
```python
import sqlite3

dbFile = 'test.db'
# 1.データベースに接続
con = sqlite3.connect(dbFile)

# 2.sqliteを操作するカーソルオブジェクトを作成
cur = con.cursor()

# 3.テーブルにデータを登録する
# 全てのカラムに値を指定してデータを追加する場合
cur.execute("INSERT INTO persons VALUES('1', 'Sato', 'male');")
# 1つのカラムに値を指定してデータを追加する場合
cur.execute('INSERT INTO persons(name) values("Tanaka")')

# 4.データベースにデータをコミット
con.commit()

# 5.データベースの接続を切断
cur.close()
con.close()
```

テーブルに含まれる全てのカラムに値を指定して複数のデータを追加する場合，以下のように記述します．
```python
import sqlite3

dbFile = 'test.db'
# 1.データベースに接続
con = sqlite3.connect(dbFile)

# 2.sqliteを操作するカーソルオブジェクトを作成
cur = con.cursor()

# テーブルにデータを登録する
data = (
    ['1', 'Sato', 'Male'],
    ['2', 'Tanaka', 'Male'],
    ['3', 'Yamada', 'Female']
    )
sql = "INSERT INTO persons VALUES(?, ?, ?)"
cur.execute(sql, data)

# 4.データベースにデータをコミット
con.commit()

# 5.データベースの接続を切断
cur.close()
con.close()
```
```data```はリスト型かタプル型変数を使用します．
テーブルのカラム数に合わせて括弧内の```?```の数を変更してください．

## テーブルのデータ取得（SELECT文）
データを取得する際の基本となる構文は以下の通りです．
```
SELECT カラム名1, カラム名2, ... FROM テーブル名;
```
```SELECT``` の後のカラム名を指定することで，特定のデータのみ取得することができます．全てのデータを取得したいときは，上記のスクリプトのように，カラム名の場所を"```*```"で記述します．
```WHERE```句を使うと取得するデータの条件を絞ることができます．紹介は割愛します．以下，サンプルコードです．
```python
import sqlite3

dbFile = 'test.db'
# 1.データベースに接続
con = sqlite3.connect(dbFile)

# 2.sqliteを操作するカーソルオブジェクトを作成
cur = con.cursor()

# 3.テーブルの全データを取得
cur.execute('SELECT * FROM persons')

# 取得したデータを出力
for row in cur:
    print(row)

# 4.データベースの接続を切断
cur.close()
con.close()
```

## テーブルデータの更新（UPDATE文）
テーブルに格納されているデータを新しい値に更新する際の基本となる構文は以下の通りです．
```
UPDATE テーブル名 SET カラム名1 = 値1, カラム名2 = 値2, ... WHERE 条件式;
```
```WHERE```句の条件式を使用して，更新の対象となるデータを指定します．条件式に一致するデータが複数の場合，該当するデータ全てが更新されます．```WHERE```句を省略すると，指定したテーブル内の全てのデータが更新されます．
```SET```の後に更新したいカラム名と更新後の値を指定します．以下，サンプルコードです．

```python
import sqlite3

dbFile = 'test.db'
# 1.データベースに接続
con = sqlite3.connect(dbFile)

# 2.sqliteを操作するカーソルオブジェクトを作成
cur = con.cursor()

# 3.テーブルにデータを登録する
data = (
    ['1', 'Sato', 'Male'],
    ['2', 'Tanaka', 'Male'],
    ['3', 'Yamada', 'Female']
    )
sql = "INSERT INTO persons VALUES(?, ?, ?)"
cur.execute(sql, data)

# 4.データベースにデータをコミット
con.commit()

# 5.データを更新
cur.execute("UPDATE persons SET name = 'ojisan' WHERE gender = 'Male';")
con.commit()

# 6.データベースの接続を切断
cur.close()
con.close()
```
これで "gender" 列が "Male" のデータの "name" が "ojisan" になりました．
```
['1', 'Sato', 'Male'],         ['1', 'ojisan', 'Male'],
['2', 'Tanaka', 'Male'],   →   ['2', 'ojisan', 'Male'],
['3', 'Yamada', 'Female']      ['3', 'Yamada', 'Female']
```

## テーブルデータの削除（DELETE文）
テーブルからデータを削除する際の基本となる構文は以下の通りです．
```
DELETE FROM テーブル名 WHERE 条件式;
```
```WHERE```句の条件式を使用して，削除の対象となるデータを指定します．条件式に一致するデータが複数の場合は，複数のデータがまとめて削除されます．```WHERE```句を省略すると，指定したテーブル内の全てのデータが削除されます．

```python
import sqlite3

dbFile = 'test.db'
# 1.データベースに接続
con = sqlite3.connect(dbFile)

# 2.sqliteを操作するカーソルオブジェクトを作成
cur = con.cursor()

# 3.データを削除する
cur.execute("DELETE FROM persons WHERE name = "ojisan";")

# 4.データベースにデータをコミット
con.commit()

# 5.データベースの接続を切断
cur.close()
con.close()
```
これで "persons" というテーブルからおじさん（"name" が "ojisan" のデータ）が抹消されました．
![IMG_0390.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617469/0ded401e-bd41-ef9c-ebac-e912c74b8519.png)