Golang Go语言中 sql 批量插入语句时, 如果唯一键冲突, 没有 err 返回, 这是正常情况?

Golang Go语言中 sql 批量插入语句时, 如果唯一键冲突, 没有 err 返回, 这是正常情况?

stmt, err := tx.Prepare(“insert into log_commited(id, xid, count, commited) values(?, ?, ?, ?)”)
// xid 是唯一键
for i := 0; i < 100; i++ {
res, err := stmt.Exec(i, 0, i, 0)
if err != nil {
// 如果唯一键 xid 冲突, 导入插入不进去, 这里不会报错
log.Print(err)
}
// 如果唯一键 xid 冲突, 导入插入不进去, 这里返回影响行数为 0
log.Print(res.RowsAffected())
}


更多关于Golang Go语言中 sql 批量插入语句时, 如果唯一键冲突, 没有 err 返回, 这是正常情况?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

解决了. sqlite3 驱动 github.com/mattn/go-sqlite3 的问题

更多关于Golang Go语言中 sql 批量插入语句时, 如果唯一键冲突, 没有 err 返回, 这是正常情况?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


唯一键冲突?还不报错?莫非是个假的数据库

我搞错了, 唯一键定义成 CONFLICT IGNORE 了, 于是冲突就被忽略了
<br>CONSTRAINT "uk_xid" UNIQUE ("xid") ON CONFLICT IGNORE<br>

在Go语言(Golang)中使用SQL进行批量插入时,如果唯一键冲突而没有返回错误(err),这通常不是一个正常情况。以下是对此现象的详细解释:

  1. 数据库约束:唯一键(Unique Key)是数据库表中的一个约束,用于确保某一列或某几列的组合在表中是唯一的。当尝试插入重复值时,数据库通常会阻止这种操作并返回一个错误。

  2. Go语言中的SQL处理:在Go语言中,通过database/sql包或ORM(对象关系映射)工具执行SQL语句时,应该能够捕获到数据库返回的错误。如果唯一键冲突而没有返回错误,可能是因为:

    • 错误处理不当:检查你的代码,确保在执行插入操作后有适当的错误检查和处理逻辑。
    • 数据库配置或驱动问题:某些数据库驱动或配置可能导致错误没有被正确传递回Go应用。
    • 事务处理:如果你是在事务中执行插入操作,并且事务在后续被回滚或未正确提交,也可能导致看似没有错误的情况。
  3. 建议

    • 确保你的Go代码中有适当的错误处理逻辑。
    • 检查数据库驱动和配置,确保它们能够正确返回错误。
    • 使用日志记录来捕获和诊断可能的错误。
    • 在开发环境中测试各种边界情况,包括唯一键冲突,以确保你的应用能够正确处理这些情况。

总之,唯一键冲突而没有返回错误通常表明存在代码或配置问题,需要仔细检查和修正。

回到顶部