【问题标题】:How to check if db execute sql fails?如何检查db执行sql是否失败?
【发布时间】:2017-09-18 21:09:34
【问题描述】:

我在 Yii2 框架中使用控制台命令,想通过 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' 在第 4 行

因为 MariaDB 10.1 不支持 JSON 数据类型。 那么,如何检查来自 $schemaFile 的所有查询/命令是否成功?试图找到一些 Yii::$app->db->getLastError() - 没有结果。 嗯,有什么想法吗?

【问题讨论】:

  • 谷歌肯定会找到什么?
  • @DoubleH 我用过,但是 execute() 不会抛出任何异常。
  • 向您展示带有异常管理的代码......请
  • @scaisEdge,我没有更改/设置异常管理 - 这是框架默认值。

标签: php database yii2


【解决方案1】:

我在这里找到了解决方案: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());
}

当第一个数据库查询失败时,带有 nextRowset() 的 do-while 循环会触发 \PDOException。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2018-03-03
    • 2018-01-27
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    相关资源
    最近更新 更多