如何在 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
- php artisan make:command 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.');
}
}
}
要从 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 的讨论。
- 打开终端
2.Copy/Paste
$ php artisan db:wipe
留言
“已成功删除所有表。”
所以我有一个问题,我有一个多租户应用程序,我有一个系统,我可以在其中使用标准 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
- php artisan make:command 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.'); } } }
要从 table 中删除记录:
DB::table('table_name')->delete();
如果您希望截断整个 table,这将删除所有行并将自动递增 ID 重置为零,您可以使用截断方法:
DB::table('table_name')->truncate();
或使用Schema::dropIfExists('table_name');
删除数据库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 的讨论。
- 打开终端
2.Copy/Paste
$ php artisan db:wipe
留言 “已成功删除所有表。”