检查 table 是否存在
Check table exists
我需要检查数据库中是否存在 table。我目前使用 Yii2 进行开发。
我的情况与this question有点不同,因为要检查的table不是(也不可能是)模型。
我试过了(new \yii\db\Query())->select('*')->from($mysticTable)->exists());
上面抛出一个 yii\db\Exception
因为,根据上面链接的问题,yii\db\Query()
class 在被问到是否 ->exists()
时试图 ->queryScalar()
。此方法总是检查结果集是否存在。
如何检查 table 是否存在?
对于 Yii2 你可以使用:
$tableSchema = Yii::$app->db->schema->getTableSchema('tableName');
如果 table 不存在,它将 return null
,因此您可以检查 returned 值是否为 null
:
if ($tableSchema === null) {
// Table does not exist
}
你可以在官方文档中找到这个方法here。
很好,你得到了一个例外。简单地解析异常消息。您会收到一条非常非常具体的消息和 SQL 缺少 table 的错误代码。
这就是我在检查时所做的,例如IF 错误是由于某些可以恢复的东西引起的,比如连接断开,而不是其他错误。
或者我看到很多人指出了获取该信息的更直接的方法。
分拆 @msfoster's answer got me closer to a solution in 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());
}
这也服务于多个数据库。
我需要检查数据库中是否存在 table。我目前使用 Yii2 进行开发。
我的情况与this question有点不同,因为要检查的table不是(也不可能是)模型。
我试过了(new \yii\db\Query())->select('*')->from($mysticTable)->exists());
上面抛出一个 yii\db\Exception
因为,根据上面链接的问题,yii\db\Query()
class 在被问到是否 ->exists()
时试图 ->queryScalar()
。此方法总是检查结果集是否存在。
如何检查 table 是否存在?
对于 Yii2 你可以使用:
$tableSchema = Yii::$app->db->schema->getTableSchema('tableName');
如果 table 不存在,它将 return null
,因此您可以检查 returned 值是否为 null
:
if ($tableSchema === null) {
// Table does not exist
}
你可以在官方文档中找到这个方法here。
很好,你得到了一个例外。简单地解析异常消息。您会收到一条非常非常具体的消息和 SQL 缺少 table 的错误代码。
这就是我在检查时所做的,例如IF 错误是由于某些可以恢复的东西引起的,比如连接断开,而不是其他错误。
或者我看到很多人指出了获取该信息的更直接的方法。
分拆 @msfoster's answer got me closer to a solution in 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());
}
这也服务于多个数据库。