4 回答
TA贡献1963条经验 获得超6个赞
调查结果
经过一些研究和修补,我有两个选择。
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 的讨论。
TA贡献1796条经验 获得超10个赞
您可以创建一个 laravel 命令来删除数据库。例如:
php artisan db:drop $database_name
php 工匠制作:命令 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.');
}
}
}
TA贡献1936条经验 获得超6个赞
要从表中删除记录:
DB::table('table_name')->delete();
如果您希望截断整个表,这将删除所有行并将自动递增 ID 重置为零,您可以使用 truncate 方法:
DB::table('table_name')->truncate();
或使用删除表 Schema::dropIfExists('table_name');
删除数据库Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("database");
- 4 回答
- 0 关注
- 131 浏览
添加回答
举报