在 symfony2 中处理 1062 重复条目异常
Posted
技术标签:
【中文标题】在 symfony2 中处理 1062 重复条目异常【英文标题】:Handle 1062 Duplicate entry Exception in symfony2 【发布时间】:2015-07-30 14:33:09 【问题描述】:我有一个 PDO 异常:
[PDO异常] SQLSTATE [23000]:完整性约束违规:1062 键 'UNIQ_88A3CEF5FB7BD549' 的重复条目 '0_L525_H132_A000_P624_M600'
这样脚本会在异常发生后继续执行?
实际上,我的实体看起来像:
/** @ORM\Table(indexes=@Index(columns="Soundex"))
* @ORM\Entity
* @UniqueEntity("Soundex")
*/
class SoundexData
/**
* @var string
*
* @ORM\Column(name="Soundex", type="string", length=255, nullable=true,unique=true)
*/
private $soundex;
我尝试使用以下方法导入数据:
try
$em->persist($data);
$em->flush();
catch(\Doctrine\DBAL\DBALException $e)
// handle exception
为了避免破坏脚本并在异常发生后继续,我坚持:(
那么我该如何处理呢?
所有这一切的原因是,我不想在我的数据库中有双重条目,所以我认为忽略双重条目会更容易,而不是检查每个数据集是否已经存在于数据库中(没有 mysql 请求最快的请求;))
【问题讨论】:
只需将\Doctrine\DBAL\DBALException
替换为\PDOException
?
不,这行不通。当我使用 \Doctrine\DBAL\DBALException 时,我收到一条“entityManager 已关闭消息。当我使用 PDO 时...我收到上面描述的异常
当抛出异常时,实体管理器会自动关闭并基本上变得无法使用。这是设计使然。有太多事情可能出错,无法继续尝试。您基本上需要先检查或下拉并使用 dbal 连接对象而不是 ORM 实体管理器。
【参考方案1】:
您应该改为捕获 PDOException:
try
$em->persist($data);
$em->flush();
catch(\PDOException $e)
// handle exception
【讨论】:
IMO 你不应该知道 ORM 使用 PDO。以上是关于在 symfony2 中处理 1062 重复条目异常的主要内容,如果未能解决你的问题,请参考以下文章
#1062 - 键 'PRIMARY' 的重复条目 '19'
[23000][1062] 键 'PRIMARY' 的重复条目 '0'