После выполнения транзакции cockroachDB, которая создает строку, я хотел бы вернуть этот идентификатор в мое приложение.
В настоящее время я определяю транзакцию, используя пакет database/sql
golang. Затем я использую клиент crdb
для выполнения транзакции против CockroachDB.
Я не могу вернуть ничего из транзакции crdb
, за исключением ошибки, связанной с самой транзакцией crdb
. Как люди извлекают свои последние созданные строки, если интерфейс не предоставляет способ вернуть новый идентификатор строки?
У меня есть транзакция, которая выполняет две вставки. Я получаю результирующие идентификаторы этих вставок и возвращаю ответ с обоими значениями идентификатора.
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 и просто изменяя его состояние в замыкании, но это выглядит как действительно плохая модель. Я уверен, что мне не хватает чего-то, что взорвется мне в лицо, если я сохраню эту схему.
Существует ли стандартный способ возврата чего-либо из транзакции?