检查表是否存在。

15

我需要检查一个数据库里是否存在一张表。我目前在使用Yii2进行开发。

我的情况和这个问题有些不同,因为要检查的表不是(也不能是)一个模型。

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

上面的代码抛出了一个yii\db\Exception异常,因为根据上面提到的问题,yii\db\Query()类会在被要求判断->exists()时尝试执行->queryScalar()方法。无论如何,这个方法都会检查结果集是否存在。

如何检查一张表是否存在?

3个回答

26

对于Yii2,您可以使用以下内容:

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

如果表不存在,它将返回 null,因此您可以检查返回值是否为 null:
if ($tableSchema === null) {
    // Table does not exist
}

你可以在官方文档这里找到这个方法。

5
对于yii1:使用getTable代替getTableSchema - Olle Härstedt

0

很好,你得到了一个异常。只需要解析异常消息,你将得到非常具体的消息和SQL错误代码,指出缺少表问题。

当检查错误是否由可以恢复的原因引起时,例如连接中断与其他错误时,这是我所做的。

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


0

一个分支 @msfoster的答案 让我更接近在 中找到解决方案。

/**
 * @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());
}

这也可以服务于多个数据库。


如果有人能把这个放到yii2源代码中,那就太好了。 - Igbanam
你看到我的回答了吗?你可以使用框架内置的方法来实现,不需要编写自己的方法。 - arogachev
@arogachev 在 Yii 2 中没有这样直接的内置方法。而且,我有多个数据库,所以 Yii::$app->db 是不够的。 - Igbanam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接