在运行db:structure:dump之后,为什么我的db / structure.sql文件包含CREATE SCHEMA语句?

时间:2019-06-07 18:45:04

标签: postgresql ruby-on-rails-5 pg-dump

迁移开发数据库后,我无法运行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架构。

1 个答案:

答案 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