sironekotoroの日記

Perl で楽をしたい

Perl から MySQL 8.x に接続した時の警告を消す

PlanetScale というサーバレスDBを使ってみました。

以下のQiita見てサインアップしました。

多少画面遷移は変わっていますが、なんとかなるレベルです。スクショ貼ってくれるのは本当にありがたい・・・

あ、無料プランで登録したのですがクレカの登録は必要でした。

qiita.com

で、その後に手元のMacで環境整備。

  • homebrew で mysql をインストール
$ mysql -V
mysql  Ver 8.1.0 for macos13.3 on x86_64 (Homebrew)

接続先のホストやデータベース名、ユーザー名とパスワードを環境変数にセットして、いざアクセス。

あっさりログイン。

$ mysql -h $DATABASE_HOST -D $DATABASE_NAME -u $DATABASE_USERNAME -p$DATABASE_PASSWORD --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/cert.pem
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1608708638
Server version: 8.0.23-PlanetScale 

Copyright (c) 2000, 2023, 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> 

mysql> select version();
+---------------+
| version()     |
+---------------+
| 8.0.23-Vitess |
+---------------+
1 row in set (0.01 sec)

拍子抜け。そのまま、SQLでテスト用のデータベースを作成。

INSERT INTO `users` (id, email, first_name, last_name)
VALUES  (1, 'hp@example.com', 'Harry', 'Potter');

SELECT * FROM users;

DESCRIBE users;

確認

mysql> SELECT * FROM users;
+----+----------------+------------+-----------+
| id | email          | first_name | last_name |
+----+----------------+------------+-----------+
|  1 | hp@example.com | Harry      | Potter    |
+----+----------------+------------+-----------+
1 row in set (0.04 sec)

普通のMySQLですなぁ。

一旦 exit; で抜けて、Perlからアクセスできるか確認していきます。

Perlからアクセス

  • cpanm で DBI, DBD::mysql をインストール
$ cpanm DBI
DBI is up to date. (1.643)

$ cpanm DBD::mysql
DBD::mysql is up to date. (4.050)
use v5.036;
use DBI;

my $dbh = DBI->connect(
    "DBI:mysql:$ENV{DATABASE_NAME}:$ENV{DATABASE_HOST}",
    $ENV{DATABASE_USERNAME},
    $ENV{DATABASE_PASSWORD},
    {
        RaiseError => 1,
        mysql_ssl  => 1,

        mysql_enable_utf8mb4 => 1,
    }
);

my $sth = $dbh->prepare("SELECT * FROM users");
$sth->execute();
while ( my $ref = $sth->fetchrow_hashref() ) {
    print
"Found a row: id = $ref->{'id'}, email = $ref->{'email'}, first_name = $ref->{'first_name'}, last_name = $ref->{'last_name'}\n";
}
$sth->finish();

とここで問題。

ちゃんと Found a row: id = 1, email = hp@test.com, first_name = Harry, last_name = Potter と意図した応答があったのですが、その前にWARNINGがついてきます。

WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version

このWARNINGを消すのに色々調べて回ったのですが、まずはStackoverflow

stackoverflow.com

翻訳使いながらみていきますが、どうも手立てはない模様。

この WARNING をGoogle 検索にいれて片っ端から見ていきます。

MySQL 公式もひっかかったのですが、この警告は特定条件の時に出る模様。

dev.mysql.com

他にも、裏で Perl 使ってそうなミドルウェアで同様の警告ログが出ているみたい。

そんなこんなでたどり着いたのがこちら。

github.com

スレッドをずっと辿っていくと、fork した修正版を作ってくれた方がいました。

github.com

ありがたい!早速インストールします。

$ cpanm https://github.com/dveeden/DBD-mysql.git

おかげで無事警告は消えました。

作者の方はテストしたらCPANにリリースするとのことでした( https://github.com/perl5-dbi/DBD-mysql/issues/354#issuecomment-1696402746)。

待ち遠しいですね。