删除前检查表是否存在?

11

我想在删除表之前检查该表是否存在。 我已经阅读了Doctrine_Table的API文档,但似乎没有类似于此的功能。 我是不是漏了什么?

我的代码如下:

$table = new Doctrine_Table('model_name', $conn);

$export = new Doctrine_Export();

$export->dropTable($table->getTableName());

当表不存在时,我得到的错误是:

Fatal error: Uncaught exception 'Doctrine_Connection_Mysql_Exception' with message 'SQLSTATE[42S02]: Base table or view not found: 1051 Unknown table

提前感谢,

Casey

5个回答

33

Doctrine2 的方法是:

$schemaManager = $this->getDoctrine()->getConnection()->getSchemaManager();
if ($schemaManager->tablesExist(array('users')) == true) {
      // table exists! ...
}

1
这种方法非常直观。 - manix
这是最简单、最不费力的检查方法。在我的情况下,我必须通过Doctrine EntityManager获取SchemaManager的引用,如下所示:$em->getConnection()->getSchemaManager(); - spetz83

6
如果您只想返回表是否存在的真/假值,这是我的做法:
public function checkTable($table)
{
    $conn = Doctrine_Manager::connection();
    try { $conn->execute("DESC $table"); }
    catch (Exception $e) { return false; }
    return true;
}

2

以下是我最终使用的内容,欢迎提出改进意见:

public static function isInstalled()
{
    $installed = true;

    $q = Doctrine_Query::create($conn);
    $q->select('t.id');
    $q->from('Table t'); //the table to check

    try {
        $q->execute();
    } catch (Doctrine_Connection_Exception $e) {
        // we only want to silence 'no such table' errors
        if ($e->getPortableCode() !== Doctrine_Core::ERR_NOSUCHTABLE) {
            throw new Doctrine_Export_Exception($e->getMessage());
        }

        $installed = false;
    }

    return $installed;
}

1
抱歉打扰,但这与我正在寻找的相关。首先,您可以简单地捕获由dropTable()抛出的Doctrine_Connection_Mysql_Exception(或其父类,以实现不可知性),并在出现错误时忽略该错误。其次,未释放您创建的Doctrine_Query将导致内存泄漏。 - lotsoffreetime

1

尝试使用以下代码来检查表是否存在:

 public function up(Schema $schema): void
{
    $schema->hasTable('table_name');
}

查看列的方法:

$schema->getTable('supply')->hasColumn('contracts')

带有跳过步骤的完整示例:

$this->skipIf($schema->getTable('supply')->hasColumn('contracts'), 'Table order_statuses already exist');

-1

我还没有测试过可移植性,但在本地SQL中,您可以执行以下操作:

DROP TABLE IF EXISTS ...

你也可以使用Doctrine运行本地SQL查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接