5

我正在使用,第一次我做 a 时Doctrine它无法数据,但第二次工作,第三次失败:INSERTpersist/flush

// there is no code executed between any of the attempts

$entity = new My\Entity();
$entity->setTag('A');  // just a random field
$em->persist($entity);
$em->flush();
// INSERT not performed
// if I exit here and check the database, no entry is added

$entity = new My\Entity();
$entity->setTag('B');
$em->persist($entity);
$em->flush();
// INSERT performed
// if I exit here and check the database, 1 entry has been added
// and I can see it's "B"

$entity = new My\Entity();
$entity->setTag('C');
$em->persist($entity);
$em->flush();
// INSERT not performed
// if I exit here and check the database, there is still only 1 entry added
// and I can see it's "B"

这是我在尝试失败时注意到的:
- PHP logserror_reporting设置为全部,其他 Doctrine 和 PHP 问题,包括警告,确实显示在日志中)中没有任何内容。
-Doctrine SQLLogger不显示任何内容(在第二次尝试时它确实显示INSERT)。

一些故障排除步骤:
-我想通过用DQL INSERT查询替换失败尝试来进一步排除故障,但是“ DQL中不允许插入语句”: (-在失败尝试中实例化之前
做一个额外的尝试没有帮助-我可以插入尽可能多的我想要手动输入数据库的条目并且它可以工作,即使在第一次尝试时也是如此。- 我有同样的问题。-我 有同样的问题。flush$entity
2.4.0-DEV
2.2.2

我可能会补充一点,代码是在PHPunit测试中执行的,并且在之前的测试中,我没有遇到这个问题(即 Doctrine 确实INSERT在第一个测试中正确执行persist/flush)。

知道问题可能来自哪里吗?

版本信息:
- PHP 5.4
- Doctrine 2.3.0(pdo_mysql驱动)
- MySQL 5.5.24
- Ubuntu 12.04
-PHPUnit 3.7.7

更新1:

好吧,这是答案的一部分。这个问题似乎是由我PHPUnit setUp()在每次测试之间截断数据库表时使用的例程引起的:

  • 如果我在每次测试之间截断我的表,我就会遇到问题(即有些INSERT失败)。
  • 如果我不截断,一切正常。

s 失败的方式INSERT似乎比最初想象的模式随机,因为我创建了 2 个测试,每个测试 3 个插入(并且只运行了那些)。在每个测试之间截断表时,每个测试中的 3 个插入会发生以下情况:
-test 1:SUCCESS / SUCCESS / SUCCESS
-test 2:SUCCESS / SUCCESS / FAILURE(我没有像我一样的 FAILURE / SUCCESS / FAILURE习惯了)。

这是我用来截断表格的一段代码:

$cmd = $em->getClassMetadata($className);
$connection = $em->getConnection();
$dbPlatform = $connection->getDatabasePlatform();
$connection->beginTransaction();
try {
    $connection->query('SET FOREIGN_KEY_CHECKS=0');
    $q = $dbPlatform->getTruncateTableSql($cmd->getTableName());
    $connection->executeUpdate($q);
    $connection->query('SET FOREIGN_KEY_CHECKS=1');
    $connection->commit();
}
catch (\Exception $e) {
    $connection->rollback();
}

我从这个 SO 帖子中得到了代码,据我所见,它看起来不错。如果我使用其他代码,我也会遇到同样的问题:

$connection = $entityManager->getConnection();
$platform   = $connection->getDatabasePlatform();
$connection->executeUpdate($platform->getTruncateTableSQL('my_table', true /* whether to cascade */));

我修改了我的模式以测试有无外键,在这两种情况下我都有同样的问题。

4

1 回答 1

0

最后,问题出现在以下情况下: -
截断函数中每个测试之间的表setUp
AND
- 仅将 Doctrine 实例实例化一次setUpBeforeClass(我当时正在使用 访问self::$em)。

OR如果我在实例化我的 Doctrine 实例时不截断每个测试之间的表,那么setUp一切正常。

以前喜欢setUpBeforeClass,现在不喜欢了……

于 2012-10-18T13:53:23.140 回答