我在Yii2框架中使用console命令,并希望通过execute()方法导入db模式文件:
public function actionReset()
{
$schemasPath = Yii::getAlias('@common') . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR;
$schemaFile = $schemasPath . 'schema.sql';
try {
$command = Yii::$app->db->createCommand(file_get_contents($schemaFile));
$command->execute();
Console::output('Schema imported.');
return self::EXIT_CODE_NORMAL;
} catch (\Exception $e) {
Console::error($e->getMessage());
}
return self::EXIT_CODE_ERROR;
}
文档说:
此方法仅应用于执行非查询SQL语句,例如INSERT,DELETE,UPDATE SQL。不会返回任何结果集。
将其运行为:
$ ./yii db/reset
不产生错误/例外。
将其运行为:
$ mysql -u{user} -p -hlocalhost -D{base} < schema.sql
产生
第241行的错误1064(42000):您的SQL语法出错;检查与MariaDB服务器版本对应的手册,以便在JSON DEFAULT NULL附近使用正确的语法 )ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci&#39;在第4行
因为MariaDB 10.1不支持JSON数据类型。 那么,如何检查$ schemaFile中的所有查询/命令是否成功?试着找到一些Yii :: $ app-&gt; db-&gt; getLastError() - 没有结果。 嗯,一些想法?
答案 0 :(得分:0)
我在这里找到了一个解决方案:https://stackoverflow.com/a/23258691/1829368,它是:
try {
$command = Yii::$app->db->createCommand(file_get_contents($schemaFile));
$command->execute();
do { } while ($command->pdoStatement->nextRowset());
Console::output('Schema imported.');
return self::EXIT_CODE_NORMAL;
} catch (\Exception $e) {
Console::error($e->getMessage());
}
当第一个db查询失败时,带有nextRowset()的do-while循环触发器\ PDOException。