gpt4 book ai didi

postgresql - 需要在事务中插入的当前行的 ID

转载 作者:IT王子 更新时间:2023-10-29 01:09:03 27 4
gpt4 key购买 nike

事务中,我插入一行

如何访问并返回插入行的 ID。正如您在下面的代码中看到的(请参阅注释//返回最后插入的 ID。)我尝试使用 LastInsertedId() 函数,但它给了我一个错误回来。

顺便说一句,我正在使用 Postgres。

我在这里错过了什么?谢谢!

/**
* Creates order and returns its ID.
*/
func createOrder(w http.ResponseWriter, r *http.Request) (orderID int) {

// Begin.
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}

// Db query.
sqlQuery := `INSERT INTO ORDER_CUSTOMER
(CUSTOMER_ID)
VALUES ($1)
RETURNING ID`

// Prepare.
stmt, err := tx.Prepare(sqlQuery)
if err != nil {
log.Fatal(err)
return
}

// Defer Close.
defer stmt.Close()

customerEmail := validateSession(r)
ID := getIDFromCustomer(customerEmail)
order := order{}
order.CustomerID = ID

// Exec.
ret, err := stmt.Exec(order.CustomerID)

// Rollback.
if err != nil {
tx.Rollback()
e := errors.New(err.Error())
msg.Warning = e.Error()
tpl.ExecuteTemplate(w, "menu.gohtml", msg)
return
}

// Return last Inserted ID.
lastID, err := ret.LastInsertId()
if err != nil {
orderID = 0
} else {
orderID = int(lastID)
}

// Commit.
tx.Commit()

return orderID
} // createOrder

这是目前可行的解决方案,欢迎进一步改进。

/**
* Creates order and returns its ID.
*/
func createOrder(w http.ResponseWriter, r *http.Request) (orderID int) {

// Begin.
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}

// Db query.
sqlQuery := `INSERT INTO ORDER_CUSTOMER
(CUSTOMER_ID)
VALUES ($1)
RETURNING ID`

// Prepare.
stmt, err := tx.Prepare(sqlQuery)
if err != nil {
log.Fatal(err)
return
}

// Defer Close.
defer stmt.Close()

customerEmail := validateSession(r)
ID := getIDFromCustomer(customerEmail)
order := order{}
order.CustomerID = ID

// Exec.
_, err = stmt.Exec(order.CustomerID)

// Rollback.
if err != nil {
tx.Rollback()
e := errors.New(err.Error())
msg.Warning = e.Error()
tpl.ExecuteTemplate(w, "menu.gohtml", msg)
return
}

// Return last Inserted ID.
//lastID, err := ret.LastInsertId()
err = stmt.QueryRow(order.CustomerID).Scan(&orderID)
if err != nil {
orderID = 0
}

// Commit.
tx.Commit()

return orderID
} // createOrder

最佳答案

发生这种情况是因为您用于 go 的 postgresql 驱动程序不支持 LastInsertedId() 函数。你没有说你使用的是哪个驱动程序,但我在使用 github.com/lib/pq 时遇到了这个问题。

答案是在您的原始示例中使用 QueryRow 代替 Exec。只需确保您在查询中使用 RETURNING ID 并将其视为选择即可。

这是一个例子(我没有测试这个,我可能会遗漏一些东西,但你明白了):

func createOrder(w http.ResponseWriter, r *http.Request) (orderID int) {

// Begin.
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}

// Db query.
sqlQuery := `INSERT INTO ORDER_CUSTOMER
(CUSTOMER_ID)
VALUES ($1)
RETURNING ID`

// Prepare.
stmt, err := tx.Prepare(sqlQuery)
if err != nil {
log.Fatal(err)
return
}

// Defer Close.
defer stmt.Close()

customerEmail := validateSession(r)
ID := getIDFromCustomer(customerEmail)
order := order{}
order.CustomerID = ID

// Exec.
var orderID int // Or whatever type you are using
err := stmt.QueryRow(order.CustomerID).Scan(&orderID)

// Rollback.
if err != nil {
//if something goes wrong set the orderID to 0 as in your original code
orderID = 0
tx.Rollback()
e := errors.New(err.Error())
msg.Warning = e.Error()
tpl.ExecuteTemplate(w, "menu.gohtml", msg)
return
}

// Commit.
tx.Commit()

return orderID
} // createOrder

关于postgresql - 需要在事务中插入的当前行的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45679537/

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