4

我这里有一点鸡和蛋的问题。我正在 Laravel 中构建一个多租户应用程序,每个租户在 Postgrsql 服务器上都有自己的数据库。所以我有一份工作来创建一个新租户,它调用:

Schema::connection($this->tenant->getDatabaseConnection())->createDatabase($this->tenant->getDatabaseName())

所以$this->tenant->getDatabaseConnection()选择一个租户数据库服务器来添加租户并返回那个服务器的连接名称。然后$this->tenant->getDatabaseName()将返回该租户的数据库名称字符串。

我遇到了一个小问题。这会引发异常:

SQLSTATE[08006] [7] 致命:数据库“port=5432”不存在(SQL:创建数据库“local_tenant_(id)”编码“utf8”)

这是因为默认情况下连接的数据库名称为空。当用户登录到他们的租户时,我们会动态地将租户模型中的 getDatabaseName() 注入其中。

但我不能在这里这样做,因为租户数据库还不存在。所以这里是我看到的选项:

  1. 在创建新租户的数据库时,选择服务器上现有租户的随机数据库“充当”。我真的不喜欢像这样暂时劫持另一个租户的数据库,即使这对那个租户应该有 0 的副作用。如果它是在服务器上配置的第一个租户,则没有可使用的现有数据库,这使得这在我的书中单独使用是不可行的。

  2. 我可以只使用 DB 提供程序 API 来创建租户数据库。这将是迄今为止最简单的,但会在本地和测试环境中中断,因此我想避免。

  3. 我可以绕过 Laravel 并为此建立与数据库的直接 PDO 连接,但如果我找不到更好的东西,我会说这是我最后的手段。

从技术上讲,您不必选择一个数据库来使用创建数据库命令。这是 Laravel 的 Schema Builder 的一个特性,它会在调用方法之前尝试选择一个 DB(在本例中为 CreatedDatabase)。有没有办法解决这个问题,所以我可以在没有 Laravel 首先尝试选择空数据库的情况下创建数据库?

4

1 回答 1

1

正确的解决方法是连接postgres数据库才能运行CREATE DATABASE。数据库总是在postgres那里(除非有人丢弃它),这就是它的设计目的。

于 2021-07-13T09:20:32.577 回答