我需要检查数据库中是否存在表。我目前正在开发使用Yii2。
我的情况与this question略有不同,因为要检查的表不是(也不能是)模型。
我试过了(new \yii\db\Query())->select('*')->from($mysticTable)->exists());
以上内容会引发yii\db\Exception
,因为根据上面提到的问题,yii\db\Query()
班级会在被问到->queryScalar()
时尝试->exists()
。这个方法总是会检查结果集是否存在。
如何检查表格是否存在?
答案 0 :(得分:19)
对于Yii2,您可以使用:
$tableSchema = Yii::$app->db->schema->getTableSchema('tableName');
如果该表不存在,它将返回null
,因此您可以检查返回值为null
:
if ($tableSchema === null) {
// Table does not exist
}
您可以在官方文档here中找到此方法。
答案 1 :(得分:0)
很好,你得到一个例外。只需解析异常消息即可。您将获得一个非常非常具体的消息和缺少表的SQL错误代码。
这是我在检查时所做的事情,例如如果错误是由于可以恢复的东西,比如连接断开,而不是其他错误。
或者我看到许多人已经指出了更直接的方式来获取这些信息。
答案 2 :(得分:0)
分拆@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());
}
这也服务于多个数据库。