patorashのブログ

方向性はまだない

database.ymlのschema_search_pathにpublicを書いたらあかん

PostgreSQL 11にアップデートしようとしていたときに起きました。

docker imageを11に変更して、CircleCIでテストを流そうとしたところ、bin/rake db:structure:loadで失敗しました。

psql:/home/circleci/workspace/db/structure.sql:15: ERROR:  schema "public" already exists

該当行はCREATE SCHEMA public;をやろうとしていたのですが、publicは最初から存在するので、そりゃエラーになるわな…と。

今まで出てなかったのに、なんでだろう?と思いつつ、Railsのコードを追ってみました。

rails/postgresql_database_tasks.rb at b366be3b5b28f01c8a55d67a5161ec36f53d555c · rails/rails · GitHub

search_pathに値があれば、--schema=値を設定するようだったので、database.ymlを確認したら、schema_search_path: publicと書いていました…。もういつ書いたのかほとんど覚えてないけれど。これをコメントアウトしてからrake db:migrateを行い、db/sctructure.sqlを再生成したところ、CREATE SCHEMA public;の表記がなくなりました。

schema_search_pathにはpublic以外のスキーマを作った時に、それらを指定したほうがよさそうです。