Проверить таблицу

Мне нужно проверить, существует ли таблица в базе данных. В настоящее время я использую Yii2.

Мой случай немного отличается от этого вопроса, потому что проверяемая таблица не является (и не может быть) моделью.

Я пробовал (new \yii\db\Query())->select('*')->from($mysticTable)->exists());

В приведенном выше примере указано yii\db\Exception, потому что в соответствии с вопросом, связанным выше, класс yii\db\Query() пытается ->queryScalar(), когда его спрашивают, если ->exists(). Неизменно этот метод проверяет, существует ли результирующий набор.

Как проверить, существует ли таблица?

Ответ 1

Для Yii2 вы можете использовать:

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

Если таблица не существует, она вернет null, поэтому вы можете проверить возвращаемое значение для null:

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

Этот метод можно найти в официальных документах здесь.

Ответ 2

Хорошо, что вы получаете исключение. Просто проанализируйте сообщение об исключении. Вы получите очень специфическое сообщение и код ошибки SQL для отсутствующей таблицы.

Это то, что я делаю при проверке, например. Если ошибка вызвана тем, что может быть восстановлено, скажем, сломанное соединение, по сравнению с некоторой другой ошибкой.

ИЛИ Я вижу, что многие люди указали гораздо более прямые способы получения этой информации.

Ответ 3

Отсчет @msfoster answer приблизил меня к решению в

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

Это также обслуживает несколько баз данных.