迁移开发数据库后,我无法运行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
架构。
答案 0 :(得分:0)
我的开发环境配置明确指定了“公共”模式。我删除了该规范,该规范允许db:test:prepare
成功完成。
# config/environments/development.rb
Rails.application.configure do
...
config.active_record.dump_schemas = "public" # <<-- DELETED!
end
通过将config.active_record.dump_schemas
设置为以下选项之一,可以配置在调用db:structure:dump
时将转储哪些数据库模式:
:schema_search_path
:这将在schema_search_path
的{{1}}设置中查找模式名称。config/database.yml
:它将转储模式名称到字符串中。这里的名称是逗号分隔的值。"<some string>"
:未指定架构名称。如果为:all
,则为ActiveRecord的Postgres适配器will set the --schema=<schema name>
flag on pg_dump
,它依次将行config.active_record.dump_schemas.blank? == true
添加到其在CREATE SCHEMA <schema name>
中的输出中。
一个有趣的副作用是,现在db/structure.sql
插入了此内容:
db:test:prepare