我正在使用,第一次我做 a 时Doctrine
它无法数据,但第二次工作,第三次失败:INSERT
persist/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 logs
(error_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 */));
我修改了我的模式以测试有无外键,在这两种情况下我都有同样的问题。