App Engine から CloudSQL インスタンスに接続しようとしています。私が設定した方法は、App Engine の外部 (つまり、開発環境) から接続するために使用できる静的 IP を使用することです。ただし、アプリが GAE 内で実行される場合、データベースに接続する唯一の方法は unix_socket を使用することです。これについて私が見つけた唯一のドキュメントは、Google 自身の docsです。
ドキュメントによると、これは接続するのに十分なはずです:
$db = new PDO('mysql:unix_socket=/cloudsql/my-prj:db1;charset=utf8',
'<username>',
'<password>'
);
CloudSQL コンソールで作成したルート パスワードと、ローカルの MySQL クライアントで作成した追加のユーザーを使用して、データベースに接続できます。SO ... IPを使用してGAEに接続しようとすると、失敗します(文書化されているように)。しかし、unix_socket=/cloudsql/...を使用しようとすると、次のエラーが発生します。
SQLSTATE[HY000] [1045] Access denied for user 'bookie'@'localhost' (using password: YES)
(もちろん、ユーザー名は bookie です)。
次のように、PDO 初期化文字列にホスト設定を含めるとします。
$db = new PDO('mysql:host=123.456.789.101;unix_socket=/cloudsql/...');
代わりに次のエラーが表示されます。
SQLSTATE[HY000] [2002] Unable to find the socket transport "tcp" - did you forget to enable it when you configured PHP?
もしよろしければ教えてください...
更新と解決策
Razvan が述べたように、問題は、ルートと私が作成した他のユーザーの両方にlocalhostに対する権限が付与されていないことでした。rootには localhost に対する権限がありましたが、そこにはパスワードが設定されていませんでした。
2 つのソリューション:
1) root のパスワードなしで接続します。
$db = new PDO('mysql:unix_socket=...', 'root', '');
2) google_sql.py を使用して他のユーザーの権限を修正します (または、SQL/MySQL クライアントに接続できます):
GRANT ALL ON `localhost`.* to bookie;