【问题标题】:Run raw SQL in migration在迁移中运行原始 SQL
【发布时间】:2015-05-01 11:26:42
【问题描述】:

我尝试使用任何语法,但不知道如何正确编写:

Schema::table('users', function(Blueprint $table){
    $sql = <<<SQL
        ALTER TABLE 'users' MODIFY 'age' DATETIME
    SQL;
    DB::connection()->getPdo()->exec($sql);
});

也试过

DB::statement('ALTER TABLE \'users\' MODIFY COLUMN DATETIME);

和双引号等等。运行迁移时,我总是得到以下信息:

语法错误或访问冲突:1064 您的 SQL 语法有错误;检查
与您的 MariaDB 服务器版本相对应的手册,以便在第 1 行的 ''users' MODIFY 'age' DATETIME' 附近使用正确的语法

是的,我已经检查过了,MariaDB 使用 MySQL 的语法(至少在这种情况下)。

【问题讨论】:

  • 你到底想做什么?
  • 我多次经历过同样的事情。似乎 MySQL 或 DB::statement 都不喜欢多行更改语句。

标签: php mysql sql laravel laravel-4


【解决方案1】:

在 MySQL 中使用反引号而不是单引号来转义标识符:

alter table `users` modify `age` datetime

在这种特殊情况下,您可以完全省略转义

alter table users modify age datetime

【讨论】:

  • 如果不使用 Blueprint 对象,是否有理由让查询位于 Schema 闭包内?
  • 你不需要 Schema 闭包,它只是单独的依赖查询。您也可以在 DB::statement('QUERY') 中运行查询。
  • @KorbenDallas:在这个问题的情况下,主要是关于为什么他的方法在 MySQL 中不起作用,而不是关于如何在 Laravel 中让它变得更好(我根本不熟悉它) )
【解决方案2】:

问题(正如@postashin 所说)是反引号。

从 Laravel 5(不确定 Laravel 4)开始,您可以这样做:

DB::statement('ALTER TABLE `users` MODIFY `age` DATETIME');

事实上,您甚至不需要后记号,因为它们不需要转义。所以你可以写:

DB::statement('ALTER TABLE users MODIFY age DATETIME');

如果你只是在执行一个数据库语句,你也不需要在闭包中使用这个。

但是,您正在做的更好的方法如下:

Schema::table('users', function(Blueprint $table) {
    $table->dateTime('age')->change();
});

请注意,由于 Doctrine 中的错误,最后一个解决方案有时会引发错误,如果您在表中有枚举(而不仅仅是您正在更改的列),通常会发生这种情况。

欲了解更多信息,请参阅Laravel Database Migration - Modifying Column

【讨论】:

    【解决方案3】:

    你可以如下使用

    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class CreateTestTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
          DB::statement('ALTER TABLE `users` MODIFY `age` DATETIME');         
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('users'); \or whatever you want on rollback
        }
    }
    

    我还创建了一个包来管理原始 sql 查询迁移(使用 phpMyAdmin 或工具创建的查询,但管理跨开发人员的迁移)

    在这里查看:https://readerstacks.com/how-to-run-raw-sql-query-in-migration-laravel/

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 2022-07-02
      • 2015-02-09
      • 1970-01-01
      • 2013-07-14
      • 2023-01-17
      • 2020-02-14
      • 1970-01-01
      • 2014-02-21
      相关资源
      最近更新 更多