迁移开发数据库后,我无法运行rails db:test:prepare
。
我的应用程序使用db/structure.sql
文件更新测试数据库:
# config/application.rb
config.active_record.schema_format = :sql
[当我运行rails db:migrate
(也运行db:structure:dump
)时,我的db/structure.sql
被更新。不幸的是,更新后,它现在在顶部附近包含此行:
CREATE SCHEMA public;
当加载到已经包含public
模式的数据库中时,它将炸弹。
我可以手动更新该行,并且SQL转储成功加载:
CREATE SCHEMA IF NOT EXISTS public;
...但是我不想每次都这样做。
我希望在运行db/structure.sql
时可以从rails db:test:prepare
中的SQL转储成功构建测试数据库,因为SQL转储不应尝试创建public
模式。
我的开发环境配置明确指定了“公共”架构。我删除了该规范,从而使db:test:prepare
成功完成。
# config/environments/development.rb
Rails.application.configure do
...
config.active_record.dump_schemas = "public" # <<-- DELETED!
end
您可以通过将db:structure:dump
设置为以下选项之一来配置在调用config.active_record.dump_schemas
时将转储哪些数据库模式:
config.active_record.dump_schemas
:这将在:schema_search_path
中的schema_search_path
设置中查找模式名称。config/database.yml
:它将转储模式名称到字符串中。这里的名称是逗号分隔的值。"<some string>"
:未指定架构名称。如果为:all
,则是ActiveRecord的Postgres适配器config.active_record.dump_schemas.blank? == true
,它依次将行will set the --schema=<schema name>
flag on pg_dump
添加到其在--schema=<schema name>
中的输出。
一个有趣的副作用是现在pg_dump
代替了此插入:
CREATE SCHEMA <schema name>