Python3からMySQLサーバにログインを試みた。


なんかわからなくなったら探すのめんどくさいからノートにしてます
すぐ忘れるんで。
でもユーザー名とかPWとか隠すのめんどくさい。。

そもそもPython3が入ってなかったので
[（このサイト）](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-programming-environment-on-an-ubuntu-20-04-server-ja)をステップ３まですべて行ってみた。

###問題のPythonからMySQLを接続する方法。
DBはschoolというものをもう作っていたのでそこに接続するようにする。

https://www.sejuku.net/blog/82657

上記のURLを参照

ライブラリのインストールを行っていく。
Debian / Ubuntuの場合

```sudo apt-get install python-dev default-libmysqlclient-dev```

Python3の場合は更に追加で以下のライブラリをインストールします。

```sudo apt-get install python3-dev```

pipから以下のコマンドを入力すればインストールが完了です。

```pip install mysqlclient```

なんかpipあたりでうまくダウンロードできなかったりしたけどその辺しらべたらゴロゴロ出てくる。


```touch ファイル名```

で適当なファイルを作る。

```vim ファイル名```

で中身にPythonスプリクトを記入していく。

```py
#!/usr/bin/env python3

import MySQLdb

connection = MySQLdb.connect(
        host='UbuntuのIP',
        user='MySQLで作ったユーザー名',
        passwd='UbuntuのPW',
        db='school')
```

結果これホストもユーザーもパスワードも書き方全部間違い。

```py
Traceback (most recent call last):
  File "./school", line 5, in <module>
    connection = MySQLdb.connect(
  File "/home/MySQLで作ったユーザー名/.local/lib/python3.8/site-packages/MySQLdb/__init__.py", line 130, in Connect
    return Connection(*args, **kwargs)
  File "/home/MySQLで作ったユーザー名/.local/lib/python3.8/site-packages/MySQLdb/connections.py", line 185, in __init__
    super().__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (2003, "Can't connect to MySQL server on 'UbuntuのIP:3306' (111)")
```
UbuntuのIPのMySQLサーバにアクセスできませんよーってエラーが出てきた。

一番下の
**```Can't connect to MySQL server```**
で検索をかけてみる。

https://casualdevelopers.com/tech-tips/how-to-fix-2003-error-when-connecting-to-mysql-server/

こんなんでてきた。
言ってることは違うんだけど最後の方をみると、127.0.0.1やlocalhost以外は外部接続になってしまいそれでエラーになるらしい？？？なのか？？？(わかってない)

なので**hostの部分をlocalhost**に変えてみる。
ついでにMySQLだというのを思い出し、**UbuntuのパスワードからMySQLのパスワードに書き換えた。**

```py
#!/usr/bin/env python3

import MySQLdb

connection = MySQLdb.connect(
        host='localhost',
        user='MySQLで作ったユーザー名',
        passwd='MySQLのPW',
        db='school')
```
```py
Traceback (most recent call last):
  File "./school", line 5, in <module>
    connection = MySQLdb.connect(
  File "/home/MySQLで作ったユーザー名/.local/lib/python3.8/site-packages/MySQLdb/__init__.py", line 130, in Connect
    return Connection(*args, **kwargs)
  File "/home/MySQLで作ったユーザー名/.local/lib/python3.8/site-packages/MySQLdb/connections.py", line 185, in __init__
    super().__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (1044, "Access denied for user 'MySQLで作ったユーザー名'@'localhost' to database 'school'")
```

あっれまたエラー？？？
でも今度は違うエラーで

```1044, "Access denied for user 'MySQLで作ったユーザー名'@'localhost' to database 'school'"```

user 'MySQLで作ったユーザー名'のデータベースschoolは拒否された・・と・・？

**Access denied for user**で検索してみる。

https://qiita.com/RyutaKojima/items/fe039a5a718dd51d6fa7

これを見たんだけどよくわからない。
**ログインで指定した情報と合致するアカウントが複数ある場合、ユーザー名よりホスト名の具体性が高いアカウントが優先して選択されるようです**
とあるのでMySQLで作ったユーザー名は優先度低いってコト？？？？(ちいかわ風)(よくわかってない)
って思ってなんとなくrootで実行したら成功した。

```py
#!/usr/bin/env python3

import MySQLdb

connection = MySQLdb.connect(
        host='localhost',
        user='root',
        passwd='MySQLのPW',
        db='school')
```
最終的にはこんな感じ。

``` ./school ```
で実行したらエラーも何も吐かなかったから実行だけされたのだと思う(ここのMySQLに繋いでとしか書いてなかったからね！)