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 についてはまた後日。