Добавление к принятому ответу: я бы порекомендовал вам сделать еще несколько вещей, чтобы обеспечить согласованность и более «ответственно» управлять своими ресурсами. Вы, конечно, закрываете соединения с БД, но я привык бы к тому, что другие ресурсы обрабатываются примерно так же.
Более того, если что-то пойдет не так, вместо усечения таблицы и перезапуска процесса, я настоятельно рекомендую вам вставить вставки в транзакцию:
defer rows.Close() // close your rows resource
defer db1.Close() // close at the very end
tx, err := db1.BeginTx(context.Background(), nil) // pass in a context with timeout or some other cancelable context if needed
if err != nil {
return err // I'm returning, you can do as you like with this
}
stmt, err := tx.Prepare("INSERT INTO ...") // create the statement once
defer stmt.Close() // add to defer stack
for rows.Next() {
// instead of your Camel_Snake_Cased vars, I'm using the preferred style and camelCase your var names instead...
if err := rows.Scan(&incidentNumber, &lastResolvedDate, &corporateID); err != nil {
tx.Rollback() // rollback transaction
return err
}
if err := stmt.Exec(incidentNumber, lastResolvedDate, corporateID); err != nil {
tx.Rollback() // again, rollback...
return err
}
}
if err := tx.Commit(); err !≃ nil {
tx.Rollback() // not needed, but I add it as a habit
return err
}
return nil
Теперь важно отметить, что все эти Close()
функции, а tx.Rollback()
вызывают все ошибки возврата. Всегда лучше , по крайней мере, обернуть их в вызов журнала следующим образом:
log.Printf("Rolling back: %+v", tx.Rollback())
// and
log.Printf("Closing DB/ROWS/STMT: %+v", db1.Close()) // same for rows, stmt etc..