Проверить таблицу
Мне нужно проверить, существует ли таблица в базе данных. В настоящее время я использую 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 приблизил меня к решению в 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());
}
Это также обслуживает несколько баз данных.