Pythonを使用したゼロからの単純なリモートMySQLサーバ設定


このガイドは３つの部分に分けられている：
1. [MySQLのインストール](#mysqlのインストール)
2. [Pythonでサーバーとデータベースの設定](#pythonでサーバーとデータベースの設定)
3. [Pythonのクライアントアプリの例](#pythonのクライアントアプリの例)


## MySQLのインストール
1. Windowsの[MySQL Installer](https://dev.mysql.com/downloads/file/?id=480824)をダウンロードする ([このリンク](https://dev.mysql.com/downloads/windows/installer/8.0.html)でMySQLのページへ行ける)。

2. インストーラを実行する。

2. 設定の種類として「Custom」を選んで、 Nextをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/99ef6adf-8c10-6b28-95c4-8bd8506b72d3.png)

4. 「MySQL Server」とパソコンにインストールされているPythonのバージョンと一致する「MySQL Connector」を選んで、「Next」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/692489b3-b9fb-9cf5-8a46-80b3d5df57f4.png)

5. 「Execute」をクリックしてしばらく待つ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/f3647b60-5f8c-2149-8560-60438ced7ee8.png)

6. 「Next」を二回クリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/5332f14e-9ae4-2820-ff21-af8c1b78fd4f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/671cf7c5-0ff7-3c2f-8867-16e336b81f8c.png)

7. 「Standalone MySQL Server / Classic MySQL Replication」を選んで、「Next」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/ad04aba2-cd2c-370b-ae4b-8643b01cac27.png)

8. パソコンの設定として「Server Computer」を選んで、Nextをクリックする。
*メモ: このチュートリアルでは、「Developer Computer」と「Server Computer」の間に違いはない*
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/6c924ac4-63ab-8e3c-8502-f8b03e3fb646.png)

9. 「Use Strong Password Encryption for Authentication (RECOMMENDED)」を選んで「Next」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/6de8d8c2-53b1-6b1f-6206-3829adfbec46.png)

10. ルート（root）アカウントのパスワードを決めて、「DB Admin]というタイプのユーザーを作って、 「Next」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/840c7db9-6f42-db60-8fa9-8adf9030dc15.png)

11. 「Next」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/386a5cab-6c51-45b4-b515-79628decc47e.png)

12. 「Execute」をクリックして、MySQLの設定が終わるまで待つ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/c98623fb-955d-70ac-ddcc-729aabe7ac31.png)

13. 「Finish」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/1c0fc777-d8f7-b104-c955-554fc38c1718.png)

14. 「Next」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/4d283d15-1c47-c0a2-f4fd-9dc07e1b67c2.png)

15. 「Finish」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/c4b76a28-91f5-5c53-7032-d6172b7ff147.png)

##Pythonでサーバーとデータベースの設定
*メモ: 以下の手続きはPythonを使わず、MySQL Shellで行うこともできる。*

####コネクタのインストール
まず、PythonでMySQLが使えるように、CommandPromptでpipを使い、コネクタをインストールする。そのために、`pip install mysql-connector`を入力する。

####Pythonの手続き
最初に、先述のモジュールをインポートする

```python:setup_example.py
import mysql.connector as db
```

次に, サーバーと繋がるために、MySQLのインストールの時に設定された「root」というユーザ，およびそのパスワードをメンバとして `MySQLConnection`のインスタンスを生成する。
その後、サーバーのカーソルを初期化する。

```python:setup_example.py
mydb = db.connect(
	host = "localhost",
	user = "root",
	passwd = "password"
	)
mycursor = mydb.cursor()
```
次に、特権を持っているユーザー，および利用するデータベースを生成する。

```python:setup_example.py

mycursor.execute("CREATE DATABASE IF NOT EXISTS my_database;")

# 「''」には自身で作成したユーザー名とパスワードを入れる
# clientipaddressをクライアントのIPアドレスに差し替える
mycursor.execute("CREATE USER IF NOT EXISTS 'username'@clientipaddress IDENTIFIED BY 'password';")
mycursor.execute("GRANT ALL PRIVILEGES ON *.* to 'username'@clientipaddress;")
```

次に、カーソルをデータベースに入れて、テーブルを生成する。

```python:setup_example.py
mycursor.execute("use my_database;")
mycursor.execute("CREATE TABLE my_table (name varchar(20),age int(2));")
```

これで、データベースの設定が完了した。

#### Python Full Code
```python:setup_example.py
import mysql.connector as db

mydb = db.connect(
	host = "localhost",
	user = "root", # サーバーのルートのアカウント
	passwd = "password"
	)

mycursor = mydb.cursor()

mycursor.execute("CREATE DATABASE IF NOT EXISTS my_database;")

# 「' ']に適切なユーザ名とパスワードを入力する
# clientipaddressをクライアントのIPアドレスに差し替える
mycursor.execute("CREATE USER IF NOT EXISTS 'username'@clientipaddress IDENTIFIED BY 'password';")
mycursor.execute("GRANT ALL PRIVILEGES ON *.* to 'username'@clientipaddress;")

# 何のデータベースを使うかを指定する
mycursor.execute("use my_database;")

# テーブルを生成する
mycursor.execute("CREATE TABLE my_table (name varchar(20),age int(2));")
```
今から、単純なクライアントアプリを作る

##Pythonのクライアントアプリの例
この例で、ネットワーク上にあるパソコンのサーバーと繋がって、先に作っておいたテーブルにデータを入れる。

####Python Step-by-Step
先ほどと同じく、コネクタのモジュールをインポートする

```python:client_example.py
import mysql.connector as db
```

それから、サーバーとそれに入っているデータベースと繋がって、カーソルを初期化する

```python:client_example.py
mydb = db.connect(
	host = serverpaddress, # replace for the server's IP address
	user = "username", # previously created user
	passwd = "password", # and its password
	database = "my_database" # we directly connect to the desired database
	)

mycursor = mydb.cursor()
```

次に, SQLのコマンドを作成して、 値を与えて, コマンドを実行する. データベースの変化を保存するために、コミットをする。

```python:client_example.py
sql_command = "INSERT INTO my_table (name, age) values (%s, %s);"
values = ('my_name', 1)
mycursor.execute(sql_command, values)

# 変化を保存する
mydb.commit();
```
SELECTでテーブルに保存されている情報を見ることが出来る

```python:client
sql_command = "select * from my_table"
mycursor.execute(sql_command)

[print(x) for x in mycursor.fetchall()]
```

出力が `('my_name', 1)`であれば成功。

####Example's Full Code

```python:client_example.py
#必要なモジュールをインポートする
import mysql.connector as db

# データベースと繋がる
mydb = db.connect(
	host = serveripaddress, # サーバーのIPアドレスに差し替える
	user = "username", # サーバを設定する時に作られたユーザー
	passwd = "password", # とそのユーザーのパスワード
	database = "my_database" # 直接的にデータベースと繋がる
	)

#カーソルを初期化する
mycursor = mydb.cursor()

# コマンドを定義する
sql_command = "INSERT INTO my_table (name, age) values (%s, %s);"

# 値を与える
values = ('my_name', 1)

# コマンドを実行する
mycursor.execute(sql_command, values)

# 変化を保存させる
mydb.commit();

# データベースからデータをもらう
sql_command = "select * from my_table"
mycursor.execute(sql_command)

# データを出力する
[print(x) for x in mycursor.fetchall()]
```