pythonでcsvのデータをデータベースへ書き込む。

# 目的
pythonでcsvのデータをデータベースへ書き込みをします。

# 環境
MariaDB version　 10.3.31-MariaDB-0+deb10u1 
Python version: 3.7.3
OS: Raspbian 10.0

# イメージ
ラズパイ内にmySQLを入れ、データベース、テーブル、要素の作成をします。そのあとpythonからcsvファイルの読み込みを行い、新規に作成したデータベースへ書き込みを行っていきます。データベースの操作は、コマンドラインから、phpmyAdminからの2種類があり、今回は、コマンドラインを使用しました。コマンドの説明については、[別の記事](https://qiita.com/yutaka_m/items/73380d45ef3dac027996)にしましたので、そちらを参考にしてください。

![スクリーンショット 2022-03-18 12.50.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/89b69286-cc68-b06b-6bc8-151edc45f9da.png)

# 手順
下記のような手順で、操作を確認しつつ、進めていきました。
1. mySQL(mariaDB)のログイン
1. データベースの作成
2. データベースの確認
3. テーブルの作成
4. テーブルの確認
5. 要素の作成
6. 要素の確認
7. pythonでcsvファイルの読み込みとデータベースへの書き込みをする。

## 1. データベースの作成
データベースを作成するため、mySQLへログインし、データを入れるための箱を作っていきます。

### 1.1 mySQL(mariaDB)のログイン
ラズパイ上で、MySQLにroot権限でログインします。初期設定では、パスワードはせって入れていないため、passwordを聞かれてもエンターでよいです。
```
mysql -u root -p;
```
### 1.2 新規データベースの作成
ラズパイには、SQLは、MariaDBをインストールしています。データベース名は、`bme280db`にしました。
```
CREATE DATABASE bme280db;
```
次に、データベースが作成できているか確認します。
```
SHOW DATABASES;
```
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/5b6802fb-db55-be64-6847-28f3c3540b7f.png)

### 1.3 データベースの使用
使用する`bme280db`へ移動します。<font color="Blue">Database changed</font>と出れば、OKです。
```
USE bme280db;
```

## 1.4 テーブルの作成
テーブル名を`weather_forecast`として、カラムを設定しました。後ほど使用するファイルに書き込まれているデータは、下記のように設定されています。
![z.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/5d51af0a-68f0-584c-c740-272323e9f6c2.png)

```
create table bme280db.weather_forecast(id int not null auto_increment primary key, date_time timestamp, pressure float NOT NULL, temperature float NOT NULL, humidity float NOT NULL);
```
テーブル名とカラムの設定を確認します。
```
SHOW CREATE TABLE weather_forecast;
```
デフォルトでは、date_timeの値が今の時間に更新される設定になっています。`timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),`
今回、csvファイルを読み込んだ値を使用します。読みだしたときの値をそのまま使ってほしいので、アップデートしないように設定しなおします。
```
ALTER TABLE weather_forecast CHANGE date_time date_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
```
![キャプ1チャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/04d34708-c533-cebd-c0cb-6a54a29fc98b.png)

## 1.5 mySQL　サーバの接続を切断する。
データベースに必要な情報が入力できたので、サーバの接続を切ります。
```
exit;
```

## 2. python環境構築

### 2.1 ライブラリのインストール
下記ライブラリをインストールします。
```
pip install mysql-connector-python
```

### 2.2 プログラム作成
下記のようにプログラムを作成しました。csvファイル名は、`bme280_db.csv`としています。DBに必要な情報(host, user, password)ですが、最初は初期設定のままなので、そのままになっています。
上記で作成した、データベース名、テーブル名、要素の名前に合わせて書き換える必要があります。作成したプログラムと同じディレクトリにcsvファイルをいれ、プログラムを実行します。

```update_sql_from_csv.py
### インポート
import csv
import mysql.connector
 
### ファイルオープン
file = open("bme280_db.csv", "r")
 
### ファイル読み込み
members = csv.reader(file)
 
### DB接続
cnx = mysql.connector.connect(host='localhost', user='root', password='', database='bme280db')
 
### カーソル作成
cursor = cnx.cursor()
 
### INSERT文作成
sql = "INSERT INTO weather_forecast ( date_time, pressure, temperature, humidity) VALUES (%s, %s, %s, %s)"
 
### データ挿入
data_count = 0
for value in members:
        if not data_count == 0:
        ### データ挿入実行
            cursor.execute(sql, value)
        data_count += 1

### コミット
cnx.commit()
 
### カーソルクローズ
cursor.close()
 
### DB切断
cnx.close()
 
### ファイルクローズ
file.close()
```

### 2.3. 挿入した要素の確認。
再度、mySQLにアクセスし、データベースへ移動します。
```
mysql -u root -p;
USE bme280db;
```
その後、下記コマンドで、テーブルに追加されたデータを確認します。
```
#  格納データの確認
select * from weather_forecast;
```

## 3. リンク
参考にしたリンク集です。
[Pythonスクリプト【MySQLにリモート接続しよう⑩～CSVデータ挿入】](https://mulberrytassel.com/python-practice-mysql-10/)
[Pythonを使ってCSVファイルのデータをMySQLに流し込む](https://freeheroblog.com/py-mysql/)