Laravel6。 SQLite での URL を使用したデータベース設定の癖を整理

まとめ

  • URLを使用したデータベース設定 データベース:利用開始 6.0 Laravel
  • DB_CONNECTION は指定した方が無難。指定しなくとも SQLite へ接続できたが、 DB_CONNECTION はデフォルト (特に設定ファイルを編集していない場合は mysql となる) となる。
  • SQLite の場合のデータベース URL のスキーマ: driver:///database?options 。具体的な例: sqlite:////absolute/path/to/database.sqlite?foreign_key_constraints=true

確認方法

vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php の 28 行目に次を記述しました。

        logger(print_r($config, true));

データベースへの接続のみを確認する方法として、マイグレーションの状態を確認するコマンド php artisan status を使用しました。接続できない等のエラーが発生しますと、例外を出力してくれます。正常な場合は、 ロギング設定で標準エラー出力にも表示するようにしている ので、次のようになりました。

$ php artisan migrate:status
[2019-11-06 07:58:44] local.DEBUG: Array
(
    [driver] => sqlite
    [database] => /absolute/path/to/database.sqlite
    [prefix] =>
    [foreign_key_constraints] => 1
    [name] => sqlite
)

Migration table not found.
$

SQLite の場合のデータベース URL のスキーマ表現はどこまで省略できるか?

OK

SQLite では設定不要なユーザ名、パスワード、ホスト、ポートが指定されていても OK

DATABASE_URL=sqlite://username:password@host:1111//absolute/path/to/database.sqlite?foreign_key_constraints=true

ユーザ名、パスワード、そしてポート番号がなくとも、区切りの : があれば OK

DATABASE_URL=sqlite://:@host://absolute/path/to/database.sqlite?foreign_key_constraints=true

ホスト名の前につける @ は省略可能で、次は OK

DATABASE_URL=sqlite://:://absolute/path/to/database.sqlite?foreign_key_constraints=true

ユーザ名とパスワードの区切り文字である :、ホストの前につける @ 、そしてホスト名とポート番号の区切り文字である : は省略可能で、次は OK

DATABASE_URL=sqlite:////absolute/path/to/database.sqlite?foreign_key_constraints=true

NG

ポート番号は数字でなければならなず、次は NG

DATABASE_URL=sqlite://username:password@host:port//absolute/path/to/database.sqlite?foreign_key_constraints=true

区切り文字が存在する場合、ホスト名は必須となるため次は NG

DATABASE_URL=sqlite://:@://absolute/path/to/database.sqlite?foreign_key_constraints=true

次のようなユーザー名とパスワードの区切り文字 : の省略は NG

DATABASE_URL=sqlite://@://absolute/path/to/database.sqlite?foreign_key_constraints=true

次のようなホスト名とポート番号の区切り文字 : の省略は NG

DATABASE_URL=sqlite://:@//absolute/path/to/database.sqlite?foreign_key_constraints=true

補足。複数項目を options に指定するときの区切り文字は "&"

例えば次のように指定すればうまくいきました。

DATABASE_URL=pgsql://laravel:secret@db:5432/laravel?charset=utf8&prefix_indexes=true&schema=public&sslmode=prefer

最初、カンマ (,) で指定して、うまくいっていませんでしたが、次のページの記述をヒントに、 "&" だと突き止めました!!!

おわりに

結構ハマってしまい、時間がかかってしまいました><。

データベース URL さえ指定すれば、 DB_CONNECTION を上書きするように扱われるだろうと思い込んでおりましたけれども、そうではありませんでした。あくまで、 DB_CONNECTION 下の項目としての DATABASE_URL であり、 config/database.php の階層構造通りでした。

どこのデータベースに接続するか、今回は SQLite でしたので、 DB_CONNECTION を指定しなくともうまくいきました。けれども、例えば PostgreSQL で mysql に存在しない schema や sslmode を指定したい場合はうまくいかない可能性がありそうです。。。と書きましたけれども、 foreign_key_constraints はデータベース URL スキーマの options に書くことで指定できましたので、きっと大丈夫です。

となると問題は DB_CONNECTION 名がデフォルトの mysql になってしまい、気持ちが悪い、ということだと思います。

これを避けるには、 config/database.php の DB_CONNECTION のデフォルトを別途作成し、 sqlite, mysql pgsql, sqlsrv の項目を全て備えた内容にすれば良さそうに感じます。

もしくは、素直に DB_CONNECTION と DATABASE_URL の両方を指定すれば良いですね。

以上です。

コメントを残す

コメントを残す