首页 >后端开发 >Golang >使用事务和 squirrel 进行 Golang postgresql 查询

使用事务和 squirrel 进行 Golang postgresql 查询

WBOY
WBOY转载
2024-02-06 09:54:081020浏览

使用事务和 squirrel 进行 Golang postgresql 查询

问题内容

我了解如何单独使用松鼠和事务,但我不了解如何一起使用它们。我什么时候应该回滚或提交? 我的尝试正确与否?如果不是,我错在哪里......

tx, err := db.repo.GetDatabase().Begin()
if err != nil {
    return nil, err
}

sb := squirrel.StatementBuilder.
    Insert("dependencies").
    Columns("correlation_id", "name", "age").
    PlaceholderFormat(squirrel.Dollar).
    RunWith(db.repo.GetDatabase())

for _, human:= range humans{
    sb = sb.Values(
        human.CorrelationID,
        human.Name,
        human.Age,
    )
}

_, err = sb.Exec()
if err != nil {
    if err := tx.Rollback(); err != nil {
        return nil, err
    }
}

if err := tx.Commit(); err != nil {
    return nil, err
}

据我了解,我正在尝试在 postgresql 中执行查询后回滚或提交


正确答案


你的努力是伟大的。但是 ....runwith(db.repo.getdatabase()) 在这种情况下是不正确的。因为您应该传递事务连接 tx 。指示 squirrel 使用事务对象作为查询的数据库连接。

如果您使用数据库连接而不是事务连接,squirrel 查询将不会成为事务的一部分。每个查询将单独执行并立即提交到数据库。

我们还可以使用 defer 语句更新 rollbackcommit 语句,这将确保在函数退出之前正确处理并完成事务。

这是更新后的代码..

tx, err := db.repo.GetDatabase().Begin()
if err != nil {
    return nil, err
}

// added defer rollback and commit
defer func() {
    if err != nil {
        fmt.Println("An error happened while executing the queries - ", err)
        tx.Rollback()
        return
    }
    err = tx.Commit()
}()

response := make([]storage.URLStorage, 0, len(urls))

sb := squirrel.StatementBuilder.
    Insert("dependencies").
    Columns("correlation_id", "name", "age").
    PlaceholderFormat(squirrel.Dollar).
    RunWith(tx)

for _, human := range humans {
    sb = sb.Values(
        human.CorrelationID,
        human.Name,
        human.Age,
    )
}

// the error will be handled by the defer
_, err = sb.Exec()

// you can execute multiple queries with the transaction
for _, human := range someOtheSlice {
    sb = sb.Values(
        human.CorrelationID,
        human.Name,
        human.Age,
    )
}

_, err = sb.Exec()

// If any error happened this query executions, all will be roll backed with the defer

希望这有帮助。

另请参阅

以上是使用事务和 squirrel 进行 Golang postgresql 查询的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除