XAMPPのMySQLにPythonから触る（mysqlclient & MySQLdb）

### １．はじめに
　ChromebookでXAMPP入れて、phpで表示して、やったーってなったけど、本題はPythonで制御すること。
　動かすまでの課題を解決したのでそのまとめです。私はChromebookだけれど、ほかのOSにも役立つ（はず）。
　都度参考文献を並べておきます。

### ２．解決した課題
　・mysqlclientのインストール時にエラーを吐く
　・MySQLdb(mysqlclientのライブラリ)でXAMPP上のデータベースにアクセスできない

### ３．解決方法（手順）

#### 　XAMPPのインストール
> ChromebookにPHP開発環境を構築（Xampp）
https://qiita.com/kamekame85/items/2c00aa9766a0c406d3cc

#### 　phpmyadminでデータベースを作って遊んだ
> phpMyAdminを使ってデータベースやテーブルを作成する
https://www.javadrive.jp/xampp/mysql/index5.html

> PHP DBからデータ取得し　テーブルに表示させる
http://dwcc.blog.fc2.com/blog-entry-31.html

　楽しかった。（小並感）

#### 　Pythonを使えないか考え始める
　本題のプログラムがPythonなので、mysqlclientにたどりつく。

#### 　mysqlclientのインストール時にエラーが出る解決策
　インストールしようとしたらこんなエラーが出た。
```terminal:error
usr01@penguin:~$ pip install mysqlclient
Defaulting to user installation because normal site-packages is not writeable
Collecting mysqlclient
 Using cached mysqlclient-2.1.1.tar.gz (88 kB)
 Preparing metadata (setup.py) ... error
 error: subprocess-exited-with-error
 × python setup.py egg_info did not run successfully.
 │ exit code: 1
 ╰─> [16 lines of output]
   /bin/sh: 1: mysql_config: not found
   /bin/sh: 1: mariadb_config: not found
   /bin/sh: 1: mysql_config: not found
   Traceback (most recent call last):
    File "<string>", line 2, in <module>
    File "<pip-setuptools-caller>", line 34, in <module>
    File "/tmp/pip-install-baag5tyx/mysqlclient_699a0a539eaa485bb590d0340efdb3c5/setup.py", line 15, in <module>
     metadata, options = get_config()
    File "/tmp/pip-install-baag5tyx/mysqlclient_699a0a539eaa485bb590d0340efdb3c5/setup_posix.py", line 70, in get_config
     libs = mysql_config("libs")
    File "/tmp/pip-install-baag5tyx/mysqlclient_699a0a539eaa485bb590d0340efdb3c5/setup_posix.py", line 31, in mysql_config
     raise OSError("{} not found".format(_mysql_config_path))
   OSError: mysql_config not found
   mysql_config --version
   mariadb_config --version
   mysql_config --libs
   [end of output]
 note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
```
　インストールできないけど、たぶんpipの問題じゃないよ。とおっしゃっております。
　mysql_configがないよ。ともおっしゃっております。

> PythonからMySQLを操作する方法（mysqlclientパッケージ）
https://pineplanter.moo.jp/non-it-salaryman/2022/07/17/python-mysqlclient/

　を参考にさせていただき、mysqlclientの前にインストールするライブラリが必要だったようで、それを１つ入れたら無事入りました。
　私に足りなかったのは、`sudo apt-get install default-libmysqlclient-dev`でした。

#### 　テストプログラムを作るも、XAMPPのSQLにつながらない

```python:error
connection = MySQLdb.connect(
    host='localhost',
    user='ユーザー',
    passwd='パスワード',
    db='データベースの名前'
)
```
　こんな感じでプログラムを組んだが、この部分でエラーが出る。

> つみきウェブ - 「Can't connect to local MySQL server through socket」エラーについて
http://www.hi-ho.ne.jp/tsumiki/book_sup2.html

　上記のサイト等を参考に調べたところ、どうやら**データベースはsocketというものに保存されているらしい**。（初心者）
　このライブラリのデフォルト設定だと、エラー文から察するに`/run/mysqld/mysqld.sock`にあるのを探しに行ってしまう様子。

　じゃあXAMPPのソケットはどこにあるのか。

　答えは、`/opt/lampp/var/mysql/mysql.sock`です。

　解決策としては、上記のサイトにあるように、サーバー側の設定を変えるか、クライアント側の設定を変えるかのどちらかです。
　今回はクライアント側の設定を変えます。

> PythonでMySQLに接続する方法【初心者向け】現役エンジニアが解説
https://magazine.techacademy.jp/magazine/18691

　このサイトでは、tmpフォルダの権限の関係で、と書かれていましたが、`unix_socket`という記述を発見しました。
　この記述により、socketの位置を詳細に設定できます。

```python:not error
connection = MySQLdb.connect(
    host='localhost',
    unix_socket='/opt/lampp/var/mysql/mysql.sock',
    user='ユーザー',
    passwd='パスワード',
    db='データベースの名前'
)
```

　こんな感じ。
　Pythonのプログラムで実行が確認できました。

### ４．おわりに
　PythonからSELECT文実行できるのが新鮮すぎて気持ちがいいです。
　参考文献はどれも読みごたえのある良いHPだったので、今回の課題以外にも参考にしてみてください。

　
　あ、XAMPPの起動コマンドが長くて面倒な人はこちらもどうぞ。（宣伝）
> Chromebook　自作コマンドの作成（XAMPP）
https://qiita.com/RS2324/items/e25909d2e937aa25e1c4