在迁移中运行原始 SQL

2022-08-30 09:35:41

我正在尝试使用任何语法,无法思考如何正确编写:

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 行的“用户修改”年龄“日期时间附近使用的正确语法

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


答案 1

问题(正如@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 中的 bug 而引发错误,如果表中有枚举(而不仅仅是要更改的列),通常会发生这种情况。

有关更多信息,请参见 Laravel 数据库迁移 - 修改列


答案 2

使用回勾而不是单引号来转义MySQL中的标识符:

alter table `users` modify `age` datetime

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

alter table users modify age datetime

推荐