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

Why does my db/structure.sql file contain a CREATE SCHEMA statement after running db:structure:dump?

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

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

# config/application.rb

config.active_record.schema_format = :sql

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

CREATE SCHEMA public;

加载到已经包含 public 架构的数据库时,这将导致爆炸。

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

CREATE SCHEMA IF NOT EXISTS public;

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

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

我的开发环境配置明确指定了 "public" 架构。我删除了该规范,它允许 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:这会在 config/database.yml 中的 schema_search_path 设置中查找架构名称。
  • "<some string>":它将转储字符串中的架构名称。此处的名称是逗号分隔值。
  • :all: 未指定架构名称。
  • 或者干脆不设置,我就是这么做的。

如果 config.active_record.dump_schemas.blank? == true,ActiveRecord 的 Postgres 适配器 will set the --schema=<schema name> flag on pg_dump,它又将行 CREATE SCHEMA <schema name> 添加到它在 db/structure.sql 中的输出。

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

CREATE SCHEMA _template;