Postgres + Rails - 将所有表从一个模式迁移到另一个模式的正确方法
Postgres + Rails - Correct way to migrate all tables from one schema to another
我目前有一个 Rails 应用程序,它使用 Postgres 并将其所有表存储在默认 public
模式下。
我正在设置一个多租户架构,所以我想将所有这些表从 public
移动到另一个架构 foo
。
我正在使用以下 Rails 迁移来完成此操作 -
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
产生什么影响(我也不太确定那会做什么)
谢谢!
这种迁移的影响超出了 Rails 的范围。这取决于哪个数据库用户(postgres 角色)Rails 用于连接到数据库以及该用户 has/lacks 在 public 模式中的权限。您需要确保在重命名模式以及数据库所有权后保留特权。我没有测试过这种迁移,但我认为从 Rails' app db 用户的角度来看它应该可以正常工作。如果您有其他依赖 public 模式的 pg 用户,您可能会干扰他们的连接和权限。
重命名 postgres 架构,尤其是默认架构,可能不应该在 Rails 迁移中完成,除非特定的 postgres 安装专用于 Rails 应用程序。
尽管有我的意见,但 postgres 的文档并未提出任何关于您的迁移应该关注的问题:http://www.postgresql.org/docs/9.4/static/sql-alterschema.html
我目前有一个 Rails 应用程序,它使用 Postgres 并将其所有表存储在默认 public
模式下。
我正在设置一个多租户架构,所以我想将所有这些表从 public
移动到另一个架构 foo
。
我正在使用以下 Rails 迁移来完成此操作 -
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
产生什么影响(我也不太确定那会做什么)
谢谢!
这种迁移的影响超出了 Rails 的范围。这取决于哪个数据库用户(postgres 角色)Rails 用于连接到数据库以及该用户 has/lacks 在 public 模式中的权限。您需要确保在重命名模式以及数据库所有权后保留特权。我没有测试过这种迁移,但我认为从 Rails' app db 用户的角度来看它应该可以正常工作。如果您有其他依赖 public 模式的 pg 用户,您可能会干扰他们的连接和权限。
重命名 postgres 架构,尤其是默认架构,可能不应该在 Rails 迁移中完成,除非特定的 postgres 安装专用于 Rails 应用程序。
尽管有我的意见,但 postgres 的文档并未提出任何关于您的迁移应该关注的问题:http://www.postgresql.org/docs/9.4/static/sql-alterschema.html