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