检查 table 是否存在

Check table exists

我需要检查数据库中是否存在 table。我目前使用 Yii2 进行开发。

我的情况与this question有点不同,因为要检查的table不是(也不可能是)模型。

我试过了(new \yii\db\Query())->select('*')->from($mysticTable)->exists());

上面抛出一个 yii\db\Exception 因为,根据上面链接的问题,yii\db\Query() class 在被问到是否 ->exists() 时试图 ->queryScalar()。此方法总是检查结果集是否存在。

如何检查 table 是否存在?

对于 Yii2 你可以使用:

$tableSchema = Yii::$app->db->schema->getTableSchema('tableName');

如果 table 不存在,它将 return null,因此您可以检查 returned 值是否为 null:

if ($tableSchema === null) {
    // Table does not exist
}

你可以在官方文档中找到这个方法here

很好,你得到了一个例外。简单地解析异常消息。您会收到一条非常非常具体的消息和 SQL 缺少 table 的错误代码。

这就是我在检查时所做的,例如IF 错误是由于某些可以恢复的东西引起的,比如连接断开,而不是其他错误。

或者我看到很多人指出了获取该信息的更直接的方法。

分拆 @msfoster's answer got me closer to a solution in

/**
 * @param $tableName
 * @param $db string as config option of a database connection
 * @return bool table exists in schema
 */
private function tableExists($tableName, $db = null)
{
    if ($db)
        $dbConnect = \Yii::$app->get($db);
    else
        $dbConnect = \Yii::$app->get('db');

    if (!($dbConnect instanceof \yii\db\Connection))
        throw new \yii\base\InvalidParamException;

    return in_array($tableName, $dbConnect->schema->getTableNames());
}

这也服务于多个数据库。