我了解如何单独使用松鼠和事务,但我不了解如何一起使用它们。我什么时候应该回滚或提交? 我的尝试正确与否?如果不是,我错在哪里......
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
语句更新 rollback
和 commit
语句,这将确保在函数退出之前正确处理并完成事务。
这是更新后的代码..
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中文网其他相关文章!