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

How to drop a database in 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 的新连接,我不直接连接到单个数据库。然后执行命令删除一个数据库,然后关闭连接。

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

您可以创建一个 laravel 命令来删除数据库。例如:

php artisan db:drop $database_name

  1. php artisan make:command dbDrop
  2. 里面 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.');
            }
    
        }
    } 
    

要从 table 中删除记录:

DB::table('table_name')->delete();

如果您希望截断整个 table,这将删除所有行并将自动递增 ID 重置为零,您可以使用截断方法:

DB::table('table_name')->truncate();

或使用Schema::dropIfExists('table_name');

删除table

删除数据库Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("database");

调查结果

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

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 的讨论。

  1. 打开终端

2.Copy/Paste

 $ php artisan db:wipe

留言 “已成功删除所有表。”