【问题标题】:Laravel: Only run migration targeting a specific database engineLaravel:仅针对特定数据库引擎运行迁移
【发布时间】:2021-07-03 08:59:29
【问题描述】:

我们的代码库目前位于 mariadb 集群后端 (10.4) 上,我们需要让它也能够利用 DigitalOcean 的托管数据库 (mySQL 8)。

Laravel 的 password_resets 迁移不包含 PK,这只是 DO 托管数据库的问题,可以通过在有问题的迁移之前添加以下内容来临时设置为忽略它:

DB::statement("SET SQL_REQUIRE_PRIMARY_KEY = OFF;");

不幸的是,mariaDB 不理解这个语句,它会抛出一个错误为“UNKNOWN system variable”。

如何将语句定位到特定的数据库引擎版本,或者在语句出错时允许忽略该语句?

【问题讨论】:

  • 您可以简单地将该语句包装在 if(config('database.connection') == 'mysql'){ ... }(或 != 'maria' 等,任何适合您的配置)中。
  • 不理想,但我没想过用 config/env 配置解决它。所以不必复制数据库连接,一个额外的 envvar 作为MYSQL8=true,默认为 false 似乎是一个简单的修复。谢谢!
  • 同意,不理想,但不幸的是 DB::statement() 函数与 DB 无关。您在其中写入的任何内容都将逐字执行,如果它与当前数据库不兼容,它将失败。这就是为什么你应该尽可能尝试使用 Eloquent,但如果你不能(比如这个用例),则需要额外的约束。一旦你得到这个工作,请随意添加你的解决方案作为答案。干杯!

标签: laravel mariadb mysql-8.0


【解决方案1】:

我通过将以下行添加到config/database.php 中的 mysql 连接来解决此问题

'mysql8' => env('DB_MYSQL8', false),

然后将支票添加到create_password_resets_table as

if(config('database.connections.mysql.mysql8')) {
    DB::statement("SET SQL_REQUIRE_PRIMARY_KEY = OFF;");
}

最后,如果数据库在 DO 托管数据库上运行,请将以下内容添加到 .env

DB_MYSQL8=true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2019-11-15
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多