Проверить наличие таблицы

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

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

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

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

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


person iGbanam    schedule 28.07.2015    source источник


Ответы (3)


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

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

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

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

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

person arogachev    schedule 28.07.2015
comment
И для yii1: используйте getTable вместо getTableSchema. - person Olle Härstedt; 27.04.2016

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

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

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

person Amit    schedule 28.07.2015

Побочный продукт @msfoster answer приблизил меня к решению в классе yii2

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

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

person iGbanam    schedule 28.07.2015
comment
если бы кто-нибудь мог поместить это в исходный код yii2. это было бы чудесно - person iGbanam; 28.07.2015
comment
Вы видели мой ответ? Вы можете сделать это с помощью встроенных методов фреймворка, для этого не нужно писать собственные методы. - person arogachev; 28.07.2015
comment
@arogachev в Yii 2 нет таких простых встроенных методов. И у меня несколько баз данных, поэтому Yii::$app->db недостаточно. - person iGbanam; 28.07.2015