如何检查db execute sql是否失败?

时间:2017-09-12 14:04:35

标签: php database yii2

我在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() - 没有结果。 嗯,一些想法?

1 个答案:

答案 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。