5

每次测试开始时截断数据库的最佳解决方案是什么?我有带外键的 InnoDB 引擎,yii 不能截断表。

4

4 回答 4

5

只是为Yii2添加一个参考 (因为没有容易找到的例子):

$this->db->createCommand()->checkIntegrity(false)->execute();
$this->truncateTable('table_name');
$this->db->createCommand()->checkIntegrity(true)->execute();
于 2015-01-12T17:51:55.727 回答
5

如果您扩展CDbTestCase并使用内置public $fixtures属性来指定您的夹具文件,它将自动处理。

但是,如果您构建了自己的夹具生成系统,或者想要截断表格,则可以使用以下内容。

$this->getFixtureManager()->checkIntegrity(false);
$this->getFixtureManager()->truncateTable('table_name');
$this->getFixtureManager()->checkIntegrity(false);

这再次假设您是CDbTestCase单元测试文件的扩展。如果不是,那么您可以直接删除完整性检查,如下所示:

Yii::app()->db->createCommand('set foreign_key_checks=0')->execute();
//do whatever, including truncating
Yii::app()->db->createCommand('set foreign_key_checks=1')->execute();

这也将暂时禁用外键检查。

于 2013-09-30T16:36:10.893 回答
0

Yii 可以截断:

Yii::app()->db->createCommand('TRUNCATE tbl_name')->execute();
于 2013-09-30T11:34:06.367 回答
0

如果您在 Yii 中使用 Fixture 支持进行测试,它将自动为您处理...

于 2013-09-30T13:24:52.790 回答