如何在 Laravel 6 中删除数据库?

oga*_*agh 2 php mysql database laravel laravel-6

所以我有一个问题,我有一个多租户应用程序,我有一个系统,我可以用标准的 CRUD 操作管理所有这些租户。我希望能够在租户被删除时删除租户数据库,但我似乎在文档中找不到任何关于能够执行此操作的内容,也找不到可以使用的 API 文档中的一系列方法。

我在网上看到了以下内容(我能找到的唯一信息),但它已有 2 年历史,但所有这些方法要么已被弃用,要么已在 Laravel 6 中移动。

Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("`{$database_name}`");
Run Code Online (Sandbox Code Playgroud)

通过我自己的测试,运行以下命令确实有效。

DB::statement('DROP DATABASE `foo`');
Run Code Online (Sandbox Code Playgroud)

我不能做的是将变量绑定到这个语句:

DB::statement(DB::raw('DROP DATABASE ?', $database_name));
Run Code Online (Sandbox Code Playgroud)

我还想使用标准的 Laravel 查询构建器,而不是自己清理信息。所以理想情况下,我希望能够做这样的事情:

DatabaseManager::dropDatabase($database_name);
Run Code Online (Sandbox Code Playgroud)

或这个:

$database = DatabaseManager::connect($database_name);
$database->dropDatabase();
Run Code Online (Sandbox Code Playgroud)

我的猜测是我需要创建一个到MySQL的新连接,我没有直接连接到单个数据库。然后执行命令删除数据库,然后关闭连接。

我将寻求自己构建它,但只是想知道是否有人对此有任何想法,或者之前是否已经这样做过?非常感谢所有帮助。

oga*_*agh 5

调查结果

经过一番研究和修改后,我有两个选择。

1. DBAL学说

我查看了 Doctrine DBAL 库,并找到了我正在寻找的东西。管理命令执行的库。

使用起来很简单,正如上面问题中提到的,你需要执行这段代码:

Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("`{$database_name}`");
Run Code Online (Sandbox Code Playgroud)

注意:为了做到这一点,您首先需要通过 Composer 请求该库:

composer require doctrine/dbal
Run Code Online (Sandbox Code Playgroud)

深入研究这个方法后,它确实不值得额外的代码,更不用说包含库了,因为它执行的代码如下[github]

composer require doctrine/dbal
Run Code Online (Sandbox Code Playgroud)

这与您在选项 2 中所做的完全相同。

2.Laravel DB::语句()

这个方法的作用完全一样,而且简单得多。所需要的只是以下代码:

/**
 * Returns the SQL snippet to drop an existing database.
 *
 * @param string $database The name of the database that should be dropped.
 */
public function getDropDatabaseSQL(string $database) : string
{
    return 'DROP DATABASE ' . $database;
}
Run Code Online (Sandbox Code Playgroud)

结论

太长了;使用 Laravel 的 DB Facade 而不是第三方解决方案来完成此操作。它更清晰、更简单,并且使用的代码更少。

现在我知道这样做可能没有太多理由,正如 @Rwd 指出的那样,但我将寻求以某种方式使用它,以便自动执行清除冗余数据库的过程。我可能会构建某种形式的容器 DatabaseManager,其中每个管理器将包含一个基于实例的数据库信息版本,并包含一个处理数据库删除的方法。

感谢@Rwd 和@apokryfos 的讨论。


小智 5

  1. 打开终端

2.复制/粘贴

 $ php artisan db:wipe
Run Code Online (Sandbox Code Playgroud)

msg "已成功删除所有表。"