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

问题描述 投票:2回答:1

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

postgresql ruby-on-rails-5 pg-dump
1个回答
0
投票

我的开发环境配置明确指定了“公共”架构。我删除了该规范,从而使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>
© www.soinside.com 2019 - 2024. All rights reserved.