Я пишу приложение 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
.