检查表是否存在
问题描述:
我需要检查一个表是否存在于数据库中。我目前正在开发使用Yii2。检查表是否存在
我的情况与this question有些不同,因为要检查的表不是(也不是)。
我已经试过(new \yii\db\Query())->select('*')->from($mysticTable)->exists());
,因为根据上述链接的问题,当被问及如果->exists()
的yii\db\Query()
类尝试->queryScalar()
以上抛出一个yii\db\Exception
。毫无疑问,这种方法会检查结果集是否存在。
如何检查表是否存在?
答
对于Yii2你可以使用:
$tableSchema = Yii::$app->db->schema->getTableSchema('tableName');
如果表不存在,它会返回null
,所以你可以为自己的null
检查返回值:
if ($tableSchema === null) {
// Table does not exist
}
你可以找到这个方法在官方文档here。
答
好,你得到一个例外。简单地解析异常消息。你会得到一个非常非常特定的消息和SQL错误代码缺失的表。
这就是我在检查例如如果错误是由于某些可以恢复的东西造成的,请说出连接断开,而不是其他错误。
或者我发现许多人已经指出了获取这些信息的更直接的方法。
答
一个分拆@msfoster's 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());
}
这也用于多个数据库。
而对于yii1:使用'getTable'而不是'getTableSchema'。 –