gpt4 book ai didi

go - 事务后返回由 CockroachDB 创建的行 ID

转载 作者:IT王子 更新时间:2023-10-29 02:06:53 25 4
gpt4 key购买 nike

在执行创建行的 cockroachDB 事务后,我想将该 ID 返回给我的应用程序。

我目前正在使用 database/sql golang 包定义一个事务。然后,我使用 crdb 客户端对 CockroachDB 执行事务。

除了与 crdb 事务本身相关的错误外,我无法从 crdb 事务中返回任何内容。如果界面不提供返回新行 ID 的方法,人们如何检索他们最近创建的行?

我有一些执行两次插入的事务。我得到这些插入的结果 ID,并返回包含这两个 ID 值的响应。

func myTransaction(ctx context.Context, tx *sql.Tx) (MyTxnResponse, error) {
var aResult string
if err := tx.QueryRowContext(ctx, `INSERT INTO foo (a,b,c) VALUES (1,2,3) RETURNING foo_id`).Scan(&aResult); err != nil { ... }

var bResult string
if err := tx.QueryRowContext(ctx, `INSERT INTO bar (d,e,f) VALUES (4,5,6) RETURNING bar_id`).Scan(&bResult); err != nil { ... }

return MyTxnResponse{A: aResult, B: bResult}
}

现在,我想对 CRDB 执行事务

var responseStruct MyTxnResponse
err := crdb.ExecuteTx(ctx.Background(), db, nil, func(tx *sql.Tx) error {
res, err := myTransaction(ctx,tx)

// This is what I am currently doing... it seems bad
responseStruct.A = res.A
responseStruct.B = res.B

return err
}
... use responseStruct for something

我能够通过使用这个外部 var 解决方案并在闭包中改变它的状态来获得事务的结果,但这似乎是一个非常糟糕的模式。如果我保持这种模式,我确信我错过了一些会在我脸上爆炸的东西。

是否有标准的方式从交易中返回一些东西?

最佳答案

您的想法是正确的:在事务外声明变量并在事务闭包内分配它们。这是 Go 中从这样的闭包“返回”事物的惯用方法,因为唯一的选择是让函数返回一个 interface{},这需要运行时强制转换才有用。

这里有几个快捷方式:由于 responseStructres 是相同的类型,您不需要列出所有字段。您可以简单地说 responseStruct = res

您甚至可以将 myTransaction 的结果直接分配给 responseStruct,从而完全避免临时 res。但是,您必须注意此处的变量范围 - 您不能使用 :=,因为那样会在闭包内创建一个新的 responseStruct。相反,您必须声明所有 other 变量(此处为 err),以便您可以使用简单的 = 赋值:

var responseStruct MyTxnResponse
err := crdb.ExecuteTx(context.Background(), db, nil, func(tx *sql.Tx) error {
var err error
responseStruct, err = myTransaction(ctx, tx)
return err
})
// use responseStruct (but only if err is nil)

关于go - 事务后返回由 CockroachDB 创建的行 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56140779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com