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

时间:2020-03-06 14:20:38  来源:igfitidea点击:

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

谢谢你的帮助

克里斯·奈特

解决方案

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

嗯,这取决于迁移情况,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中的此列表

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

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

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