3

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

谢谢你的帮助

克里斯奈特

4

3 回答 3

5

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

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

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

于 2008-09-18T10:56:14.747 回答
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并且不能正常工作。

于 2008-09-18T10:20:18.423 回答
0

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

于 2013-08-14T09:23:48.623 回答