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

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


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


Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("`{$database_name}`");

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


DB::statement('DROP DATABASE `foo`');

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


DB::statement(DB::raw('DROP DATABASE ?', $database_name));

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


DatabaseManager::dropDatabase($database_name);

或这个:


$database = DatabaseManager::connect($database_name);

$database->dropDatabase();

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


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


富国沪深
浏览 132回答 4
4回答

噜噜哒

打开终端2.复制/粘贴 $ php artisan db:wipemsg "成功删除所有表。"

神不在的星期二

调查结果经过一些研究和修补,我有两个选择。1. DBAL 原则我查看了 Doctrine DBAL 库,并找到了我正在寻找的东西。管理命令执行的库。它使用起来很简单,正如上面问题中提到的,您需要执行这段代码:Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("`{$database_name}`");注意:为了做到这一点,您首先需要通过 composer 获取库:composer require doctrine/dbal深入研究了这个方法,它真的不值得额外的代码,更不用说包含一个库,因为它执行的代码如下[github]:/** * 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;}这与您在选项 2 中所做的完全相同。2. Laravel DB::statement()这种方法的作用完全相同,而且要简单得多。所需要的只是以下代码:DB::statement("DROP DATABASE `{$database_name}`");结论TLDR;使用 Laravel 的 DB Facade 代替第三方解决方案来执行此操作。它更清晰、更容易,并且使用更少的代码。现在我知道这样做可能没有太多理由,正如@Rwd 所指出的那样,但我将寻求以某种方式使用它来自动化清除冗余数据库的过程。我可能会构建某种形式的容器 DatabaseManager,其中每个管理器都将包含一个基于实例的数据库信息版本,并包含一个处理数据库删除的方法。感谢@Rwd 和@apokryfos 的讨论。

白衣染霜花

您可以创建一个 laravel 命令来删除数据库。例如:php artisan db:drop $database_namephp 工匠制作:命令 dbDrop在 commands/dbDrop.php 内:protected $signature = 'db:drop {database_name}';protected $description = 'Drop a database.';public function __construct(){    parent::__construct();}public function handle(){    // Fetch the defined database name    $db_type = \Config::get('database.default');    $connection = \Config::get('database.connections.'.$db_type);    $host = $connection['host'];    $username = $connection['username'];    $password = $connection['password'];    $database = $connection['database'];    $this->dropDB($host, $username, $password, $database);}  protected function dropDB($host, $username, $password, $database) {        try        {            $db = $this->argument('database_name');            // Create connection            $conn = new \mysqli($host, $username, $password);            $this->info(json_encode($conn));            // return $conn;            // Check connection            if ($conn->connect_error) {                die("Connection failed: " . $conn->connect_error);            }             // Drop database            $sql = "DROP DATABASE `$db`";            if ($conn->query($sql) === TRUE) {                echo "Sucessfully dropped database $db!";            } else {                echo "Error dropping database: " . $conn->error;            }            $conn->close();        }        catch(Exception $e){            $this->info('');            echo "Error dropping database: $db";            $this->info('');            echo json_encode($e->getMessage());            $this->info('');            $this->info('You can try the mysql shell.');        }    }} 

LEATH

要从表中删除记录:DB::table('table_name')->delete();如果您希望截断整个表,这将删除所有行并将自动递增 ID 重置为零,您可以使用 truncate 方法:DB::table('table_name')->truncate();或使用删除表 Schema::dropIfExists('table_name');删除数据库Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("database");
打开App,查看更多内容
随时随地看视频慕课网APP