🏭

【Laravel】SeederでFactory使ってテストデータを作ろうとするとDBに接続できない

2023/03/29に公開

一部原因が把握しきれていないところもあるが、同じように困っている人が居る場合用に備忘録。

結論

DBの接続環境を指定して実行する

User::factory(100)->connection('local')->create();

概要

dockerを使って構築したLaravelでSeederからUserのテストデータ100件くらいを錬成しようとしたら

User::factory(100)->create();

を実行したら

AWSのregionを指定せんかー!(意訳)

と言われた。
DBはDynamoDBを使用している。
ローカルの開発環境ではローカル用のdockerイメージのDynamoDBコンテナを使っている。

Laravelで作成したシステムは正常に稼働しており、ブラウザから操作する分にはDBにも正常に接続している。また、

for($i=0;$i<100;$i++) {
    User::create([
        'name' => 'hoge tarou',
	'email' => 'hogehoge@hoge.com'
    ]);
}

とModelを呼んで実行する分には動く。

上記のように最悪for文などを使用して、欲しい件数だけテストデータを作成することは可能だが、今回はどうしてもFactoryにあるfakerが使いたかったため、調査開始。

分かったこと

技術系のサイトで似たような質問をしている人はいたが、どうにも「.env書いてませんでした」などの話ばかりで今回困っていることの解決にはならないっぽい。

.envファイルにDynamoDBへの接続情報はあるし、ブラウザから操作する際にはローカルのDynamoDBには接続できるため設定ミスという可能性は低そうと判断。

regionの指定がない=接続情報をまるっと持っていなさそうと思い、

User::factory();

の中身をなんとなく眺める。
connection空じゃね?

そこから、「seeder connection」などでググり、connection()がある!と。
結論のように指定したら無事動作したとさ。

分からなかったこと

今回の根本的な原因が分からなかった。
artisanコマンドで実行するから.envから実行環境が判別できなくて実行できなかったのか?とも思ったが、Modelを呼んでの実行は問題無く行えたため、単純に判別できてないとも言い切れ無さそう。

調べてみたいと思うが既知の方がいたら教えていただきたい。

Discussion