为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
富国沪深 2022-07-16 18:52:46
所以我有一个问题,我有一个多租户应用程序,我有一个系统,我可以通过标准 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的新连接,而我没有直接连接到单个数据库。然后执行命令删除数据库,然后关闭连接。我将寻求自己构建这个,但只是想知道是否有人对这个有任何想法,或者是否以前做过这个?非常感谢所有帮助。
查看完整描述

4 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

  1. 打开终端

2.复制/粘贴

 $ php artisan db:wipe

msg "成功删除所有表。"


查看完整回答
反对 回复 2022-07-16
?
神不在的星期二

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


查看完整回答
反对 回复 2022-07-16
?
白衣染霜花

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.');

        }


    }


查看完整回答
反对 回复 2022-07-16
?
LEATH

TA贡献1936条经验 获得超6个赞

要从表中删除记录:

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

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

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

或使用删除表 Schema::dropIfExists('table_name');

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


查看完整回答
反对 回复 2022-07-16
  • 4 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信