Postgres + Rails - 将所有表从一个模式迁移到另一个模式的正确方法

时间:2015-10-14 03:41:31

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

我目前有一个使用Postgres的Rails应用程序,并将其所有表存储在默认的public架构下。

我正在设置更多的多租户架构,因此我想将所有这些表从public移到另一个架构foo

我正在使用以下Rails Migration来完成此任务 -

class MovePublicToFoo < ActiveRecord::Migration
  def up
    [
      "ALTER SCHEMA public RENAME TO foo;",
      "CREATE SCHEMA public;"
    ].each { |s| ActiveRecord::Base.connection.execute(s) }
  end

  def down
    [
      "DROP SCHEMA public;",
      "ALTER SCHEMA foo RENAME TO public;"
    ].each { |s| ActiveRecord::Base.connection.execute(s) }
  end
end

这是在Postgres中解决这个问题的正确方法吗?

我不知道盲目移动默认架构的危险是什么,以及可能对search_path产生什么影响(我不太确定它是什么)

谢谢!

1 个答案:

答案 0 :(得分:2)

此类迁移的影响超出了Rails的范围。它取决于Rails用于连接数据库的数据库用户(postgres角色)以及用户在公共模式中具有/缺少的权限。您将确保在重命名架构以及数据库所有权后保留权限。我还没有测试过这种迁移,但我认为从Rails的角度看它应该可以正常工作。 app db用户。如果您有其他pg用户依赖公共架构,则可能会干扰其连接和权限。

重命名postgres架构,特别是默认架构,可能不应该在Rails迁移中完成,除非特定的postgres安装专用于Rails应用程序。

尽管我的意见,postgres&#39;文档没有提出与迁移有关的任何内容:http://www.postgresql.org/docs/9.4/static/sql-alterschema.html