MySQLとPythonを基礎から学ぶその3 PythonでMySQLを動かす

この記事は[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の25日目の記事です。ついに最終日になってしまいました。
PythonでMySQLが使えるようです。MySQLでもPyhonとJavascriptが使えるようですが、調べても文献が一向に見つからなかったので今回は取り上げません
# PythonでMySQLが動く
PythonでMySQLを使う場合に使える外部ライブラリは様々あるようですが、その中でもここでは「PyMySQL」を使っていきます。
外部ライブラリなのでインストールが事前に必要です。pip install PyMySQLでインストールしておきましょう。まずは前に作っておいたSeasonテーブルの中身を確認してみます
この前MySQLのほうで作っておいたTestdbのデータベースを使用します。
### テーブルの中身を出力する
```py
import pymysql
conn=pymysql.connect(host="localhost",user="****",port=3306,password="**********",db="Testdb")
cursor=conn.cursor()
cursor.execute("select* from Season;")
print( cursor.fetchall())
cursor.close()
conn.close()
```
結果:
```
((1, 'Spring'), (2, 'Summer'), (3, 'Autumn'), (4, 'Winter'))
```
# 解説
特にcursorとfetchについて書いています。
まずは
```
import pymysql
```
pymysqlを使えるようにします。次にサーバーに接続します。
```
conn=pymysql.connect(host="localhost",user="****",port=3306,password="**********",db="Testdb")
```
サーバーへの接続のためにはpymysql.connectを使います。()内にはhost名（今回はlocalhost）、userはユーザ名(MySQLで設定したもの)、portは3306（デフォルトは3306のようです。）、passwordはMySQLで最初に接続する際に使用するパスワード、dbは使用するデータベース(データベースを作る場合などは書く必要がないです。今回はTestdbの中のデータを取るために指定しています)になります。
```
cursor=conn.cursor()
```
これはPythonがMySQL上でカーソルを使うために必要だそうです。
```
cursor.execute("select* from Season;")
```
ここでようやくMySQLが実行されます。()内にはMySQLで使うためのコマンドが入れられており、それを実行するようにしています。
```
print(cursor.fetchall())
```
先ほど実行した結果を取ってくるものです。fetchallはすべてを取ってくるという意味です。出力結果をすべてprintで出力しています。
```
cursor.close()
conn.close()

```
カーソルを終了して、サーバーへの接続も終了する処理です。なくても動くようです。

### テーブルを作る
先ほどの中身をちょっと変えるだけでうまくいきます。
```
cursor.execute("select* from Season;")
```
実行するものの中身を変えるだけのようです。ただしテーブルの中身の追加や削除、更新などテーブルの中身に手を加えた場合はcommitする必要があるみたいです。下で解説します。
### forを使って一度に大量にデータを入れる
Pythonの場合はforを使ってループさせることで大量のデータを入れることができます。
```py
import pymysql
import random as rd
conn=pymysql.connect(host="localhost",user="root",port=3306,password="2tw1259a",db="Testdb")
cursor=conn.cursor()

for i in range(100):
   
    if i==0:
        continue
    cursor.execute("insert into TestB values("+str(i)+","+str(rd.randint(1,50))+");")
    conn.commit()

cursor.execute("select* from TestB;")
print(cursor.fetchall())
cursor.close()
conn.close()
```
ここでは100個のデータをforを使って自動でテーブルに追加しています。先ほどテーブルに変更を加えた場合はcommitが必要だと言いました。
```
 conn.commit()
```
この行になります。変更をMySQL側に保存するものっぽいです。これがないとエラーが出ないのにSQL側でデータが反映されないといったことが起こりました。
結果:
```
> select* from TestB;
+----+--------+
| id | Random |
+----+--------+
|  1 |     30 |
|  2 |      5 |
|  3 |     22 |
|  4 |     44 |
|  5 |      3 |

~~~以下略~~~
```
MySQL側で反映されていることが確認できます。
大量のデータも簡単に追加できることがわかりました。
# excelのデータをMySQLに入れてみる
PythonではExcelをいじることもできます。つまり、Excelのデータを取ってきてMySQL側に受け渡すことが可能っぽいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/62aa0155-046c-c461-b1a2-b41cec2fa7b3.png)
データを用意しました。最終的にMySQL側にこのデータを渡せればOKです。Excelと実行するpythonのプログラムは同じ場所に移動させてあります（違ってもパスを設定すればいけます。）
```py
import pymysql
import openpyxl as px
conn=pymysql.connect(host="localhost",user="root",port=3306,password="2tw1259a",db="Testdb")
cursor=conn.cursor()
book=px.load_workbook("Kazu.xlsx")
sheet=book['Sheet1']
A1=sheet["A1"].value
B1=sheet["B1"].value

print(sheet["A1"].value)
cursor.execute("create table Testdb.xlsxTest("+A1+" int,"+B1+" int);")
for i in range(7):
   
    if i==0:
        continue
    cursor.execute("insert into xlsxTest values("+str(sheet.cell(row=i+1,column=1).value)+","+str(sheet.cell(row=i+1,column=2).value)+");")
    conn.commit()

cursor.execute("select* from xlsxTest;")
print(cursor.fetchall())
cursor.close()
conn.close()

```
結果: 
```
> select* from xlsxTest;
+---+---+
| x | y |
+---+---+
| 3 | 3 |
| 7 | 6 |
| 4 | 9 |
| 8 | 8 |
| 5 | 5 |
+---+---+
```
いけました。
openpyxlを使っています。

# まとめ
PythonでもMySQLに接続してデータをいじることができる。Pythonでは大量のデータを一度に入れたいときとか、Excelのデータをそのまま入れたいときとかに使いやすい。
なお、テーブルに変更を加えるときはcommit()する必要がある。

25日間お疲れ様です。強くなれた気がします。
# 参考文献

https://marsquai.com/a70497b9-805e-40a9-855d-1826345ca65f/f3c4e20d-fb69-49ce-aaec-a492f1954411/57077ae3-7eb8-4cd6-be99-9e662988e02a/

https://blog.symdon.info/posts/1642051460/

https://www.altx.co.jp/careetec/magazine/column/hishinuma-python-syoshinnsya/