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

Posted

技术标签:

【中文标题】Ruby on Rails 迁移 - 创建新的数据库模式【英文标题】:Ruby on Rails Migration - Create New Database Schema 【发布时间】:2010-09-10 14:46:22 【问题描述】:

我有一个运行 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 db 架构以及何时谈论 postgres 架构。 另外,举例和命名也有帮助。对于与您的应用无关的我们来说,您的问题的抽象描述更难掌握。 你的database.yml是怎么配置的? 【参考方案1】:

这取决于你的迁移是什么样的,你的 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

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

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

【讨论】:

谢谢,是 search_path 已更改但未重置为公共【参考方案2】:

我不确定我是否理解您的确切要求,但是,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并且不能正常工作。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Ruby on Rails 迁移 - 创建新的数据库模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby on Rails ActiveRecord 迁移中处理过长的索引名称?

Ruby On Rails框架相关

Ruby on Rails:如何使用迁移向现有列添加非空约束?

在 Elastic Beanstalk 环境上部署 ruby​​ on rails 应用程序时出现 AWS 数据库迁移错误

ruby on rails Heroku 迁移错误

使用 Ruby on rails Elastic Beanstalk 将 RDS 迁移到 Aurora MySQL