Ruby on Rails迁移 - 创建新的数据库架构

4
我有一个迁移任务,运行一个SQL脚本来创建一个新的Postgres模式。在Postgres中创建新数据库时,默认情况下会创建一个名为“public”的模式,这是我们使用的主要模式。创建新数据库模式的迁移似乎运行良好,但问题出现在迁移运行后,当Rails尝试更新它依赖的“schema_info”表时,它说它不存在,就好像它正在寻找它在新的数据库模式而不是默认的“public”模式,而该表实际上在后者中。
有没有人知道我如何告诉Rails在“public”模式下查找此表?
执行的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 = ??

感谢您的帮助。
克里斯·奈特

你可能需要编辑你的问题,以澄清何时谈论Rails数据库模式和何时谈论Postgres模式。 - kch
此外,举例和命名事物会有所帮助。对于我们不涉足您的应用程序的人来说,抽象描述问题更难以理解。 - kch
你的 database.yml 配置如何? - Dan Harper
3个回答

5
那要看你的迁移情况、数据库.yml情况以及你想尝试什么。无论如何,需要更多信息,如果必要请更改名称并发布一个示例database.yml和迁移。例如,迁移是否更改了适配器的search_path?但要知道,一般来说,Rails和PostgreSQL模式不能很好地配合(尚未解决?)。有一些问题需要解决。尝试构建一个只使用一个pg数据库的应用程序,并使用两个非默认模式,一个用于开发,另一个用于测试,请告诉我有关它的信息。(从以下内容中,我已经可以告诉您将会遇到问题)。也许自上次我玩它以来已经修复了,但当我看到这个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-generating-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

(yes this is wrong if you use the same database with different schemas for both dev and test, this would drop both databases each time you run the unit tests!)
实际上,如果您在开发和测试中使用相同的数据库但有不同的模式,则这是错误的。这将导致每次运行单元测试时都会删除两个数据库!我开始编写补丁。第一个是适配器中的索引方法,它并不关心搜索路径,在某些情况下会出现重复的索引,然后我开始受到其他问题的影响,最终放弃了使用模式的想法:我想完成我的应用程序,并没有额外的时间来解决使用模式时遇到的问题。

谢谢,是搜索路径已更改但未重置为public。 - Chris Knight

1

我不确定我完全理解你的问题,但是rake将期望更新Rails模式的版本到schema_info表中。检查你的database.yml配置文件,这是rake将要查找以更新表格的地方。

有可能你正在迁移到一个新的Postgres模式,而rake仍然指向旧的模式吗?那么我不确定标准的Rails迁移是否适合你。最好创建自己的rake任务。

编辑:如果你引用了两个不同的数据库或Postgres模式,Rails在标准迁移中不支持这种情况。Rails假设只有一个数据库,因此从一个数据库迁移到另一个数据库通常是不可能的。当你运行“rake db:migrate”时,它实际上会查找RAILS_ENV环境变量以找到database.yml中正确的条目。如果rake从“development”环境和database.yml的数据库配置开始迁移,它将期望在迁移结束时更新到该环境。

因此,你可能需要在Rails堆栈之外完成这个操作,因为你不能在Rails中同时引用两个数据库。有一些插件尝试允许这样做,但它们非常hacky且无法正常工作。


0
你可以使用pg_power。它提供了额外的DSL来迁移创建PostgreSQL模式,不仅如此。

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