我正在 Nestjs 中编写一个服务,它使用 typeorm 与 MySQL 服务器进行通信。假设我创建一个表
test_table
,其中有两列 col1
和 col2
,col1
具有 UNIQUE
约束。
如果尝试插入重复值,我会收到如下错误:
{
query: 'INSERT INTO `test_table`(`col1`, `col2`) VALUES (?, ?)',
parameters: [ 'test-val-1', 'test-val-2' ],
driverError: {
code: 'ER_DUP_ENTRY',
errno: 1062,
sqlState: '23000',
sqlMessage: "Duplicate entry 'test-val-1' for key 'test_table.col1'",
sql: "INSERT INTO `test_table`(`col1`, `col2`) VALUES ('test-val-1', 'test-val-2')"
},
code: 'ER_DUP_ENTRY',
errno: 1062,
sqlState: '23000',
sqlMessage: "Duplicate entry 'test-val-1' for key 'test_table.col1'",
sql: "INSERT INTO `test_table`(`col1`, `col2`) VALUES ('test-val-1', 'test-val-2')"
}
如果我返回
sqlMessage
它会公开表名称和列名称,我不会明确获得错误列的名称。
有没有办法以某种格式提取信息,以便我可以获得导致错误的列名称以及它导致什么错误?
我能想到的解决方案有两种:
在尝试插入之前通过访问数据库来检查重复条目。由于额外的数据库调用,它会增加延迟。
或者我可以编写一个解析器,从消息中提取相关信息,但这似乎太过分了,因为如果消息由于某种原因发生变化,它就会中断。
解析sqlMessage确实是某种废话。而且,多条记录可能存在冲突。预检查也不是最好的选择。
只需为 errno: 1062 编写一个错误处理程序即可。您可以使用 try catch。在处理器中查找有问题的记录。我认为这是最佳解决方案。