【Python】SQLiteに触れてみた

#はじめに
筆者ですが、2021/3/19時点ではPython歴１週間未満の駆け出しプログラマなので
記事について誤りがある可能性がありますが、その際は教えていただけますと幸いです。

Pythonの基礎について一通り学習したので、
データベース（以下、DB）についての学習をはじめました。

SQLiteについて学習すれば、MySQLやPostgreSQLに関しても
ある程度理解はできるとのことなのでSQLiteを学習することにしました。

その時の備忘録としてこの記事を書いていきます。

なお、Macでの内容となりますので、Windwosの方は一部違う箇所があると思います。

##SQLite3のインストール

SQLite3のインストールを行う前にHomebrewをインストールする必要があります。

ターミナルを開いて下記のコマンドを実行してください。
心配な方は[Homebrew公式サイト](https://brew.sh/)をご覧ください。

```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

インストール完了後、下記コマンドを実行します。

```
$ brew install sqlite3
```

パスワードなどを聞かれるので入力してあげればインストール完了です。

##SQLite3を使ってみる

ということで準備が出来ましたので、実際にSQLiteを使ってみます。

まずはDBを作成してみたいと思います。

プロジェクト内は下記のようになります。
![スクリーンショット 2021-03-19 13.15.04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797483/8f3e7342-9688-f927-78ce-0025b3ecb5b3.jpeg)

下記のコマンドを実行します。

`conn = sqlite3.connect("test_sqlite.db")`はDBを作成、
`conn.close()`はDBへのアクセスを終了　という感じだと思います。

```python
import sqlite3

conn = sqlite3.connect('test_sqlite.db')
conn.close()
```
こちらを実行すると、新しくファイルが追加されていることが確認出来ます。
![スクリーンショット 2021-03-19 13.19.41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797483/ff1329f7-c071-8003-35dc-9ac3e04c418e.jpeg)

DBではテーブルというものを使いデータを保管しているらしいのですが、
そのテーブルについての定義方法について解説します。

DBを操作する際にはカーソルを宣言し、そのカーソルに対して処理を指示するらしいです。

みなさんもPCを操作するさにカーソルを動かして操作すると思いますが、
そのようなイメージになります。

次のコマンドではカーソルを宣言し、テーブルの定義をしています。
また、最後に設定を反映させるための`commit()`を忘れないようにしてください。

```python
conn = sqlite3.connect("test_sqlite.db")

curs = conn.cursor()

curs.execute('CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING)')
conn.commit()

conn.close()
```

下記のコードはSQLの構文になります。
`CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING`


何をしているのかというと、
`CREATE TABLE persons()`でpersonsというテーブルを定義しています。

そのpersonsの中にどのような情報を格納するのかというと、`id`と`name`です。
また、それらの単語の直後に記載されているものが型になります。

つまり、`id(int型)`と`name(string型)`ということになります。

idの方には`id INTEGER PRIMARY KEY AUTOINCREMENT`と記載されていますが、
これは、nameの個数に対してidを1つずつ増やしてくださいね。的な内容です。

**name**に**ジョン**という値を入れたら、**id**には**1**が入り、
**name**に**ナンシー**という値を入れたら、1増えて**id**には**2**が入ります。

実際にコードを実行したらターミナルで下記コマンドを実行して確認してみます。

```
$ sqlite3 test_sqlite.db 
```

すると、対話状態になると思います。
対話状態になったら下記コマンドを実行し、personsと表示されたらテーブルが出来ています。

```
sqlite> .tables
persons
sqlite>
```

では、実際にデータを格納していきたいと思います。
データを入れるには`INSERT`を使用します。

personsのnameにMikeというvaluesを格納してください。
みたいな感じですね！

先ほどのテーブルを作る際のコマンドが残っていると、
すでにテーブルが存在しています。と言った内容のエラーが出るかもしれないので、
すでにテーブルを定義している方はコメントアウトしておいてください。

```python
curs.execute('INSERT INTO persons(name) values("Mike")')
curs.execute('INSERT INTO persons(name) values("Jon")')
curs.execute('INSERT INTO persons(name) values("Nancy")')

conn.commit()
```

では、ターミナルでデータが入っているか確認したいと思います。
`SELECT * from persons;`で確認します。


1|Mike
2|Jon
3|Nancy

と表示されたらOKです。

```
$ sqlite3 test_sqlite.db
sqlite> SELECT * from persons;
1|Mike
2|Jon
3|Nancy
sqlite> 
```

もしくは、pythonで下記コマンドでも確認出来ます。

```python
curs.execute('SELECT * from persons')
print(curs.fetchall())
```

データのアップデートは下記のコマンドで行います。
`Mike`を`Michel`に変更する場合のコマンドです。

```python
curs.execute('UPDATE persons set name = "Michel" WHERE name = "Mike"')
conn.commit()

curs.execute("SELECT * from persons")
print(curs.fetchall())

実行結果
[(1, 'Michel'), (2, 'Jon'), (3, 'Nancy')]
```

確認するとMichelに変わっているのが確認出来ます。

次にデータの削除を行います。

データの削除は`DELETE`で行います。
テーブルを指定する場合は`DELETE FROM <テーブル名>`という形で記述します。

```python
curs.execute('DELETE FROM persons WHERE name = "Michel"')
conn.commit()

curs.execute("SELECT * from persons")
print(curs.fetchall())

実行結果
(2, 'Jon'), (3, 'Nancy')]
```

Michelがいなくなっていることがわかります。

このようにしてデータの操作を行っていきます。

最後にDBの操作を終了する際に、
最後に下記コマンドを記述することを忘れないようにしてください。

```python
curs.close()
conn.close()
```

また、今回の作業を行っていて、
一度記述して実行したコマンドをコメントアウトや削除して、
同じコマンドを実行しないようにしていました。

毎回そのような作業をするのは面倒なので、
最初にDBファイルを作成した箇所を下記のように書き換えます。

```python
# conn = sqlite3.connect("test_sqlite.db")
conn = sqlite3.connect(':memory:')
```

これはmemory上にDBを作成するということになります。

なお、memory上のデータはプログラミングが終了すると
自動で開放されるので毎回実行することが出来ます。

いちいちコメントアウトなどをしなくてすむのでお勧めです！

#さいごに

SQLの構文も覚えなければならないので少々大変ですが、
Pythonを使う上ではDBは絶対に必要な知識だと聞いたことがあるので、
ぜひ一緒に覚えましょう...！

以上、最後までご覧いただきありがとうございました。