使用Propel for my ORM在symfony 1.4中工作(不知道如何找到Propel的版本)。
在对数据库中具有唯一约束的对象的单元测试中,我测试了被捕获的异常:
try {
$room1a->save();
// Shouldn't have saved, so shouldn't have an id
$t->ok(!$room1a->getId(), "Failed to save duplicate room");
} catch (Exception $e) {
$t->ok($e, "Threw exception on creating duplicate room");
}
但如果我然后更正重复并再试一次,那么
$room1a->setCode('1a');
$room1a->save();
$t->ok($room1a->getId()), "Saved this time");
我得到"无法获得序列ID":
PropelException: Unable to get sequence id. [wrapped:
SQLSTATE[25P02]: In failed sql transaction: 7 ERROR: current
transaction is aborted, commands ignored until end of transaction
block]
(in
lib/vendor/symfony/lib/plugins/sfPropelPlugin/lib/vendor/propel/util/BasePeer.php
on line 264)
我尝试重新创建对象(即一个新的Room对象)并保存它,结果相同;似乎连接(?)中存在需要重置的状态。
我发现的唯一方法是回滚交易并开始新交易。
答案 0 :(得分:0)
我找到了答案:这就是transactions的工作方式。
我将单元测试脚本包装在一个事务中,以便不更改数据库,我没有意识到引发约束错误会中止事务。
对我来说有点烦人,因为我必须重新启动新事务并重新设置数据,以便进行后续测试。