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

7

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

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

我期望当我运行rails db:test:prepare命令时,测试数据库可以成功地从db/structure.sql中的SQL转储构建,因为SQL转储不应尝试创建public模式。


我的 structure.sql 没有尝试创建 public 架构。您使用的是哪个版本的 PostgreSQL? - mu is too short
从我的 db/structure.sql 文件中: -- 从数据库版本11.3转储 -- 由pg_dump版本11.3转储 - ulysses_rex
@ulysses_rex 我也遇到了这个问题。你找到解决方案了吗? - Greg W
@GregW 我找不到一个简单的解决方案。ActiveRecord 的 postgres 适配器通常使用 pg_dump 命令和 --schema=<schema_name> 参数,这会创建 CREATE SCHEMA <schema_name> 这一行。pg_dump 没有提供选项来将其更改为 ...IF EXISTS... - ulysses_rex
来源:activerecord-5.0.7.2/lib/active_record/tasks/postgresql_database_tasks.rb:45 - ulysses_rex
显示剩余5条评论
1个回答

3

我的开发环境配置明确指定了 “public” 模式。我去掉了这个指定,从而使 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设置为以下选项之一来配置要转储的数据库模式:
  • :schema_search_path:在config/database.yml中查找schema_search_path设置中的模式名称。
  • "<some string>":它将转储字符串中的模式名称。这里的名称是逗号分隔的值。
  • :all:未指定模式名称。
  • 或者根本不设置,这就是我所做的。

如果config.active_record.dump_schemas.blank? == true,则ActiveRecord的Postgres适配器将在pg_dump上设置--schema=<schema name>标志,这反过来会将CREATE SCHEMA <schema name>行添加到其在db/structure.sql中的输出中。

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

CREATE SCHEMA _template;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接