我有一个运行 SQL 脚本来创建新的 Postgres 架构的迁移。默认情况下,在 Postgres 中创建新数据库时,它会创建一个名为“public”的模式,这是我们使用的主要模式。创建新数据库模式的迁移似乎工作正常,但是在迁移运行后出现问题,当rails尝试更新它所依赖的“schema_info”表时,它说它不存在,就好像它不存在一样在新的数据库模式中查找它,而不是在表实际所在的默认“公共”模式中查找。

有谁知道我如何告诉 Rails 查看此表的“公共”模式?

正在执行的 SQL 示例:~

CREATE SCHEMA new_schema;
COMMENT ON SCHEMA new_schema IS 'this is the new Postgres database schema to sit along side the "public" schema';
-- various tables, triggers and functions created in new_schema

抛出错误:~

RuntimeError: ERROR C42P01  Mrelation "schema_info" does not exist
L221    RRangeVarGetRelid: UPDATE schema_info SET version = ??

感谢您的帮助

克里斯·奈特

有帮助吗?

解决方案

好吧,这取决于您的迁移是什么样子,您的database.yml 是什么样子以及您到底想尝试什么。无论如何,需要更多信息来更改名称(如果需要)并发布示例database.yml 和迁移。例如,迁移是否会更改适配器的 search_path ?

但要知道,一般而言,rails 和 postgresql 模式不能很好地协同工作(还?)。

有几个地方有问题。尝试构建一个仅使用一个 pg 数据库和 2 个非默认模式的应用程序,一个用于开发,一个用于测试,并告诉我这一点。(从下面我已经可以告诉你,你会被烧伤)

也许自从我上次玩它以来它就被修复了,但是当我看到 http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name-breaks-when-non-default-schema-is-used 或这个 http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generate- Correct-schema-list 或者 postgresql_adapter.rb 中的这个

  # Drops a PostgreSQL database
  #
  # Example:
  #   drop_database 'matt_development'
  def drop_database(name) #:nodoc:
    execute "DROP DATABASE IF EXISTS #{name}"
  end

(是的,如果您对开发和测试使用具有不同模式的相同数据库,这是错误的,这会在每次运行单元测试时删除两个数据库!)

我实际上开始编写补丁。第一个是适配器中的索引方法,它不关心 search_path 在某些情况下会出现重复的索引,然后我开始受到其余部分的伤害,最终放弃了使用模式的想法:我想得到 我的 应用程序完成后,我没有额外的时间来解决使用模式时遇到的问题。

其他提示

我不确定我是否完全理解您的要求,但是,rake 希望将 Rails 架构的版本更新到 schema_info 表中。检查你的database.yml配置文件,这是rake寻找要更新的表的地方。

您是否有可能迁移到新的 Postgres 架构而 rake 仍指向旧架构?我不确定标准 Rails 迁移是否是您所需要的。最好创建您自己的 rake 任务。

编辑:如果您引用两个不同的数据库或 Postgres 架构,Rails 在标准迁移中不支持此操作。Rails 采用一个数据库,因此通常不可能从一个数据库迁移到另一个数据库。当您运行“rake db:migrate”时,它实际上会查看 RAILS_ENV 环境变量以在 database.yml 中找到正确的条目。如果 rake 开始迁移时查看 database.yml 中的“开发”环境和数据库配置,它将期望在迁移结束时更新到此环境。

因此,您可能需要从 Rails 堆栈外部执行此操作,因为您无法在 Rails 中同时引用两个数据库。人们尝试过使用插件来实现这一点,但它们主要是 hacky 并且无法正常工作。

您可以使用 pg_power. 。它不仅提供用于迁移创建 PostgreSQL 模式的额外 DSL。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top