MAMPでMySQLへ接続する

Pythonでデータベースアクセスをしようと、MacにMAMPを入れたり、Pythonを入れたりしている。

まずはMAMPのスタートページみたいなものへアクセスする。

WebStartをクリックする。

URLは http://localhost/MAMP/?language=English で、
phpinfo()や、MySQLの設定情報が得られる。

さっそく接続してみる。

mysql -h localhost -u root -p -P 3306
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

エラー出た。

Socketが 設定情報に書いてあるパスと違う?

which mysql
/opt/homebrew/opt/mysql-client/bin/mysql

MAMPじゃない方のmysqlを実行していたようだ。

MAMPの方のmysqlを実行するため、
cd /Applications/MAMP/Library/bin してから、./mysql で実行するとOKだった。

/Applications/MAMP/Library/bin $ ./mysql -h localhost -u root -p -P 3306
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 572
Server version: 5.7.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

コマンドラインで、データベース一覧表示、データベース作成、データベース選択、テーブル作成、テーブル一覧表示、テーブルのカラム表示まで一気にやってみる。

途中一度間違えて、PostgreSQLのクセで \d を打ってしまった。

次にデータ挿入と表示をしてみるが問題なし。

今度はコマンドラインではなく、Webアプリとしてphpで接続してみる。
Examplesのコードのままで問題なく接続できた。

「Connect using an UNIX socket (preferred)」の例で接続したとき。
こちらは、ホストを localhostにしてある。

「Connect via network」の例で接続したとき。
こちらは、ホストを127.0.0.1かつ、ポート番号を指定してある。

違いは今ひとつわからないが。preferredとオススメされているので、localhostを使った方が良いのかな。

次はWebアプリとしてPythonで接続してみる。
Exampleのコードでほぼ行けるのだが、いくつかいじったせいでエラーなどで困った。


まずは、先頭が #!/usr/bin/env python3 ではだめだった。まぁライブラリを入れたりすればできなくは無いのだろうけど、MAMPのphthonを使った方が良さそうだ。pyenv でせっかくインストールしたんだけど、下記に変えておく。
#!/usr/bin/env /Applications/MAMP/Library/bin/python

次に引っかかったのは、インデントでのタブとスペースの混在。phpだとifでもなんでも { } で囲みたいところ、Pythonではインデントで範囲指定をしなければならないとのこと。
まぁ、それも修正。

テーブルから値を取り出して print する部分でApacheでエラー
AH01215: UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 4-5: ordinal not in range(128): /Applications/MAMP/htdocs/mysql_test.py

ちなみにログは tail -30 -f /Applications/MAMP/logs/apache_error.log で確認

ascii以外の文字が入っているとか。プログラムでのあるあるではあるが、コードに不審な文字はない。どうやら、テーブルのレコードの中身に”名前”という日本語があり、それが駄目らしい。
一旦、updateで中身をasciiだけにする。

UPDATE table1 SET name=’namae’ WHERE id=1;

これで、エラー(Apache)が変わり、
malformed header from script ‘mysql_test.py’: Bad header: 1 | namae

Header出力する前に、printするなということでしょうか。
レコード内容のprintより前に、
print “Content-Type: text/html\n\n”
しておく。

これで、「一応」MySQLへ接続し、テーブルの中身を表示できた。

UnicodeEncodeError についてはまた後日。