当前位置:首页> 正文

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

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

Ruby on Rails Migration - Create New Database Schema

我有一个运行SQL脚本的迁移,以创建新的Postgres模式。 默认情况下,在Postgres中创建新数据库时,它将创建一个名为" public"的架构,这是我们使用的主要架构。 迁移以创建新的数据库模式似乎运行良好,但是该问题在迁移运行后发生,当Rails尝试更新其依赖的'schema_info'表时,该表表明该表不存在,就好像它是 在新的数据库模式中查找它,而不是在表实际所在的默认"公共"模式中查找。

有人知道如何告诉Rails查看此表的"公共"模式吗?

正在执行的SQL示例:?

1
2
3
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

抛出错误:?

1
2
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-或此http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-list或postgresql_adapter.rb中的此列表

1
2
3
4
5
6
7
  # Drops a PostgreSQL database
  #
  # Example:
  #   drop_database 'matt_development'
  def drop_database(name) #:nodoc:
    execute"DROP DATABASE IF EXISTS #{name}"
  end

(是的,如果您为开发和测试使用相同数据库且具有不同架构的数据库,那么这是错误的,每次运行单元测试时,这两个数据库都将被删除!)

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


您可以使用pg_power。它不仅提供了用于迁移的其他DSL以创建PostgreSQL模式。


我不确定我确切地理解您的要求,但是,瑞克将期望将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,无法正常工作。


展开全文阅读

相关内容