【问题标题】:Check table exists检查表是否存在
【发布时间】:2015-10-18 16:47:30
【问题描述】:

我需要检查数据库中是否存在表。我目前使用 Yii2 进行开发。

我的情况与this question 有点不同,因为要检查的表不是(也不能是)模型。

我试过(new \yii\db\Query())->select('*')->from($mysticTable)->exists());

上面抛出了一个yii\db\Exception,因为根据上面链接的问题,yii\db\Query() 类在被问到是否->exists() 时尝试->queryScalar()。这个方法总是检查结果集是否存在。

如何检查表是否存在?

【问题讨论】:

    标签: php mysql yii2 dao


    【解决方案1】:

    对于 Yii2,您可以使用:

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

    如果表不存在,则返回null,所以可以检查返回值是否为null

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

    你可以在官方文档here找到这个方法。

    【讨论】:

    • 对于 yii1:使用 getTable 而不是 getTableSchema
    【解决方案2】:

    很好,你得到了一个例外。只需解析异常消息。您将收到一条非常具体的消息和缺少表的 SQL 错误代码。

    这就是我在检查时所做的事情,例如如果错误是由于可以恢复的东西引起的,比如连接断开,而不是其他一些错误。

    或者,我看到许多人指出了获取该信息的更直接的方法。

    【讨论】:

      【解决方案3】:

      @msfoster's answer 的衍生产品让我更接近 中的解决方案

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

      这也服务于多个数据库。

      【讨论】:

      • 如果有人可以把它放到 yii2 源中。那会很好
      • 你看到我的回答了吗?您可以使用框架内置方法来实现,无需编写自己的方法来实现。
      • @arogachev 在 Yii 2 中没有这么简单的内置方法。而且,我有多个数据库,所以 Yii::$app->db 是不够的。
      猜你喜欢
      • 2010-10-02
      • 2011-07-21
      • 2017-08-09
      • 2017-02-16
      • 2015-04-28
      • 2015-09-26
      • 2018-09-08
      相关资源
      最近更新 更多