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

uly*_*rex 6 postgresql pg-dump ruby-on-rails-5

迁移我的开发数据库后,我无法运行rails db:test:prepare.

我的应用程序使用该db/structure.sql文件来更新测试数据库:

# config/application.rb

config.active_record.schema_format = :sql
Run Code Online (Sandbox Code Playgroud)

当我运行rails db:migrate(也运行db:structure:dump)时,我db/structure.sql的更新。不幸的是,它现在在更新后在顶部附近包含此行:

CREATE SCHEMA public;
Run Code Online (Sandbox Code Playgroud)

这将在加载到已经包含public模式的数据库中时爆炸。

我可以手动更新该行并成功加载 SQL 转储:

CREATE SCHEMA IF NOT EXISTS public;
Run Code Online (Sandbox Code Playgroud)

...但我不想每次都这样做。

我希望在db/structure.sql运行时从 SQL 转储成功构建测试数据库,rails db:test:prepare因为 SQL 转储不应尝试创建public模式。

uly*_*rex 3

我的开发环境配置明确指定了“公共”模式。我删除了该规范,从而可以db:test:prepare成功完成。

# config/environments/development.rb

Rails.application.configure do
  ...
  config.active_record.dump_schemas = "public" # <<-- DELETED!
end

Run Code Online (Sandbox Code Playgroud)

db:structure:dump您可以通过设置config.active_record.dump_schemas以下选项之一来配置调用时将转储哪些数据库架构:

  • :schema_search_pathschema_search_path:这会在 中的设置中查找架构名称config/database.yml
  • "<some string>":它将转储字符串中的模式名称。这里的名称是逗号分隔的值。
  • :all:未指定模式名称。
  • 或者根本不设置它,这就是我所做的。

如果config.active_record.dump_schemas.blank? == true,ActiveRecord 的 Postgres 适配器会将标志设置--schema=<schema name>为 onpg_dump,这又会将该行添加CREATE SCHEMA <schema name>到其输出中db/structure.sql

一个有趣的副作用是现在db:test:prepare插入这个:

CREATE SCHEMA _template;

Run Code Online (Sandbox Code Playgroud)