使用 Apartment gem 将单个租户应用程序转换为多租户应用程序
Converting a single Tenant Application to a multitenant one using Apartment gem
我构建了一个单租户 rails 应用程序,所有核心功能都已准备好发布。但我现在想使用 apartment gem 使其成为多租户。我发现的大多数教程都展示了如何从头开始。但是我没有找到关于如何将现有项目转换为内置多租户的指示。根据我的研究,我发现所有模型都需要在迁移中添加一个租户 ID。如何轻松地将其添加到所有现有模型中?安装 gem 和 运行 生成器就足够了吗?我是 运行 一个 rails 5
API 应用程序,有近 30 个模型并在 Ubuntu 18.04
环境中使用 graphql
ruby。
关于如何做到这一点有什么想法吗?
您似乎没有任何理由不能将其添加到现有的 Rails 应用中。我自己没有这样做过,似乎也没有关于如何迁移现有应用程序的任何具体教程。按照 README and also see the wiki 上显示的 gem 设置说明进行其他配置和说明。尽可能使用 TDD 并期望对您的应用程序进行更改以使一切正常工作。根据您现有应用程序的复杂程度,将决定此迁移的工作量。
您可能希望在浏览器中使用 lvh.me:3000
而不是 localhost:3000
作为根域和端口,并可能在启动本地服务器时使用 rails s -b lvh.me
。
如果您想安全地破解此分支,我建议您在开始之前对本地开发数据库进行完整备份,以便在出现严重错误时可以回滚到稳定的当前版本。例如,如果您使用的是 Postgres,则有 pg_dump and pg_restore
这种方法与良好的 TDD 相结合应该可以让您到达需要的地方。
感谢@lacostenycoder 为我指明了正确的方向。这是我所做的。
简短回答:是的,安装 gem、运行 生成器并创建租户模型就足够了。公寓读取您的架构并为租户创建架构。
长答,我的经验:
- 我备份了数据库中的现有数据以防万一。
- 已安装公寓gem
如果您像我一样使用任何 PostgreSQL 数据库扩展(pgcrypto、uuid-ssop),您需要了解扩展不会自动加载到新创建的模式中。(look here for more details) 执行以下操作:
- 按照 github readme 的说明创建
shared_extensions
模式
- 创建您的第一个租户。如果它有效,一切都很好。但是...
- 如果这不起作用,我的意思是当您创建一个租户时,您会收到类似
ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: function gen_random_uuid() does not exist
的错误
或ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: function uuid_generate_v4() does not exist
(更多详情here, here and here) like it was my case when creating my first tenant, I discovered that once the extensions are enabled on the public
schema, they cannot be installed in the shared schema shared_extensions
in this case. So you have to change them from the public schema to the shared_extensions
schema. get more details here
如果您在 rails dbconsole
中使用 uuid-ossp ALTER EXTENSION "uuid-ossp" SET SCHEMA shared_extensions
- 如果您在
rails dbconsole
中使用 pgcrypto ALTER EXTENSION "pgcrypto" SET SCHEMA shared_extensions
公寓 gem 将在您正确设置并创建您的第一个租户后为您的租户创建所有模型。
有关查看这些 github 公寓问题的更多信息。 Here and here。
我花了一天时间弄明白并收集了这些信息。我希望它可以节省您的时间和头痛!
我构建了一个单租户 rails 应用程序,所有核心功能都已准备好发布。但我现在想使用 apartment gem 使其成为多租户。我发现的大多数教程都展示了如何从头开始。但是我没有找到关于如何将现有项目转换为内置多租户的指示。根据我的研究,我发现所有模型都需要在迁移中添加一个租户 ID。如何轻松地将其添加到所有现有模型中?安装 gem 和 运行 生成器就足够了吗?我是 运行 一个 rails 5
API 应用程序,有近 30 个模型并在 Ubuntu 18.04
环境中使用 graphql
ruby。
关于如何做到这一点有什么想法吗?
您似乎没有任何理由不能将其添加到现有的 Rails 应用中。我自己没有这样做过,似乎也没有关于如何迁移现有应用程序的任何具体教程。按照 README and also see the wiki 上显示的 gem 设置说明进行其他配置和说明。尽可能使用 TDD 并期望对您的应用程序进行更改以使一切正常工作。根据您现有应用程序的复杂程度,将决定此迁移的工作量。
您可能希望在浏览器中使用 lvh.me:3000
而不是 localhost:3000
作为根域和端口,并可能在启动本地服务器时使用 rails s -b lvh.me
。
如果您想安全地破解此分支,我建议您在开始之前对本地开发数据库进行完整备份,以便在出现严重错误时可以回滚到稳定的当前版本。例如,如果您使用的是 Postgres,则有 pg_dump and pg_restore
这种方法与良好的 TDD 相结合应该可以让您到达需要的地方。
感谢@lacostenycoder 为我指明了正确的方向。这是我所做的。
简短回答:是的,安装 gem、运行 生成器并创建租户模型就足够了。公寓读取您的架构并为租户创建架构。
长答,我的经验:
- 我备份了数据库中的现有数据以防万一。
- 已安装公寓gem
如果您像我一样使用任何 PostgreSQL 数据库扩展(pgcrypto、uuid-ssop),您需要了解扩展不会自动加载到新创建的模式中。(look here for more details) 执行以下操作:
- 按照 github readme 的说明创建
shared_extensions
模式 - 创建您的第一个租户。如果它有效,一切都很好。但是...
- 如果这不起作用,我的意思是当您创建一个租户时,您会收到类似
ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: function gen_random_uuid() does not exist
的错误
或
ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: function uuid_generate_v4() does not exist
(更多详情here, here and here) like it was my case when creating my first tenant, I discovered that once the extensions are enabled on thepublic
schema, they cannot be installed in the shared schemashared_extensions
in this case. So you have to change them from the public schema to theshared_extensions
schema. get more details here如果您在
rails dbconsole
中使用 uuid-ossp - 如果您在
rails dbconsole
中使用 pgcrypto
ALTER EXTENSION "uuid-ossp" SET SCHEMA shared_extensions
ALTER EXTENSION "pgcrypto" SET SCHEMA shared_extensions
- 按照 github readme 的说明创建
公寓 gem 将在您正确设置并创建您的第一个租户后为您的租户创建所有模型。
有关查看这些 github 公寓问题的更多信息。 Here and here。 我花了一天时间弄明白并收集了这些信息。我希望它可以节省您的时间和头痛!