Ruby on Rails迁移 - 创建新的数据库模式

时间:2008-09-18 09:49:20

标签: ruby-on-rails ruby postgresql schema migration

我有一个迁移,它运行一个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 = ??

感谢您的帮助

Chris Knight

3 个答案:

答案 0 :(得分:5)

这取决于你的迁移是什么样的,你的database.yml看起来是什么以及你想要尝试什么。无论如何,如果必须更新名称,请更改名称,并发布示例database.yml和迁移。迁移是否会更改适配器的search_path?

但是知道一般rails和postgresql架构不能很好地协同工作(但是?)。

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

也许自从我上次玩它以来我已经修复了但是当我在postgresql_adapter.rb中看到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或者这个时

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

(是的,如果对dev和test使用不同模式的相同数据库,这是错误的,每次运行单元测试时都会丢弃两个数据库!)

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

答案 1 :(得分:0)

我不确定我完全理解你的要求,但是,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并且无法正常工作。

答案 2 :(得分:0)

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