【发布时间】:2018-09-21 06:14:30
【问题描述】:
我正在编写一个 Go 应用程序,它应该将文件中的数千个值插入数据库。只要所有值都可以插入数据库,这很好。如果其中一个查询失败,那么之后的所有查询都会因为pq: : current transaction is aborted, commands ignored until end of transaction block而失败
我想插入所有元素,如果一个元素插入失败,应该跳过它并插入其他元素。
我的代码:
func (db *Database) Insert(values []Value) (transerr error) {
tx, err := db.Begin()
if transerr != nil {
return nil, err
}
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}
stmt, err := tx.Prepare("INSERT INTO foo VALUES (?)")
if err != nil {
return err
}
defer stmt.Close()
for _, value : range values {
_, err = stmt.Exec(value)
if err != nil {
log.Error(err)
}
}
return nil
}
我尝试添加 tx.Rollback() 以防 stmt.Exec 失败 - 但是这会导致 sql: statement is closed。
【问题讨论】:
-
我建议您对查询进行结构化,这样就不会发生这些类型的错误,但无论如何......底层数据库技术是什么?
-
数据库是 MySQL/PostgreSQL - 构造查询非常困难,因为输入是随机的 - 但我会试一试,感谢您的提示!
-
您的插入失败是因为
INSERTed 值与数据库中已经存在的其他行的约束(例如UNIQUE索引)冲突,还是因为其他问题? -
事务的重点是确保所有或NONE的语句都执行。这不是你想要的。不要为交易烦恼。
-
数据互不相关——数据库只是一个存储,数据互不相关。我考虑过不使用任何事务——这对性能有影响吗?谢谢你的回答:)
标签: go