在Golang中运行一个删除查询并返回被删除实体的ID的方法是:

huangapple go评论65阅读模式
英文:

How to run a delete query in golang that returns the id of deleted entity

问题

如何在我的 Golang 代码中运行这个查询?我尝试了以下代码:

resp, err := pgConnPool.Exec(context.Background(), deleteQuery)

但是它返回的是 pgConn.CommandTag(可以用来获取行数,但不是实际的行)。

英文:

Query :

DELETE FROM *tableName* RETURNING *id*

How to run this query in my golang code?
I tried

resp, err := pgConnPool.Exec(context.Background(), deleteQuery)

but it gives pgConn.CommandTag(can be used to get rowsCount but not actual rows)

答案1

得分: 1

查询是正确的(只需确保以RETURNING *id*结尾)。

假设您只删除一个实体,您可以使用QueryRow,如@mkopriva建议的那样。

package yourpackage

import (
  "context"

  "github.com/google/uuid"
  "github.com/jackc/pgx/v4"
)

func YourMethod() {
  // ...

  var recordID uuid.UUID

  err := pgConnPool.QueryRow(context.Background(), deleteQuery).Scan(&recordID)
  if err != nil {
    // 处理错误。
  }

  // recordID 现在包含已删除记录的ID。
}

或者包装在处理程序中

package yourpackage

import (
  "context"

  "github.com/google/uuid"
  "github.com/jackc/pgx/v4"
)

func DeleteRecord(/*your args*/) (uuid.UUID, error) {
  var recordID uuid.UUID

  // 构建您的 deleteQuery 对象。

  err := pgConnPool.QueryRow(context.Background(), deleteQuery).Scan(&recordID)

  return recordID, err
}

如果您想要添加一次删除多个记录的可能性

package yourpackage

import (
  "context"

  "github.com/google/uuid"
  "github.com/jackc/pgx/v4"
)

func DeleteRecords(/*your args*/) ([]uuid.UUID, error) {
  var recordIDs []uuid.UUID

  // 构建您的 deleteQuery 对象。

  rows, err := pgConnPool.Query(context.Background(), deleteQuery)
  if err != nil {
    return nil, err
  }

  defer rows.Close()

  for rows.Next() {
    var recordID uuid.UUID

    if err := rows.Scan(&recordID); err != nil {
      return nil, err
    }

    recordIDs = append(recordIDs, recordID)
  }

  return recordIDs, rows.Err() // 确保没有发生读取错误  
}
英文:

The query is OK (just ensure it ends with RETURNING *id*).

Assuming you are only deleting one entity, you can use QueryRow as suggested by @mkopriva

package yourpackage

import (
  "context"

  "github.com/google/uuid"
  "github.com/jackc/pgx/v4"
)

func YourMethod() {
  // ...

  var recordID uuid.UUID

  err := pgConnPool.QueryRow(context.Background(), deleteQuery).Scan(&recordID)
  if err != nil {
    // handle error.
  }

  // recordID now contains the id of the deleted record.
}

Or wrapped in a handler

package yourpackage

import (
  "context"

  "github.com/google/uuid"
  "github.com/jackc/pgx/v4"
)

func DeleteRecord(/*your args*/) (uuid.UUID, error) {
  var recordID uuid.UUID

  // build your deleteQuery object.

  err := pgConnPool.QueryRow(context.Background(), deleteQuery).Scan(&recordID)

  return recordID, err
}

If you want to add the possibility to delete multiple records at once

package yourpackage

import (
  "context"

  "github.com/google/uuid"
  "github.com/jackc/pgx/v4"
)

func DeleteRecords(/*your args*/) ([]uuid.UUID, error) {
  var recordIDs []uuid.UUID

  // build your deleteQuery object.

  rows, err := pgConnPool.Query(context.Background(), deleteQuery)
  if err != nil {
    return nil, err
  }

  defer rows.Close()

  for rows.Next() {
    var recordID uuid.UUID

    if err := rows.Scan(&recordID); err != nil {
      return nil, err
    }

    recordIDs = append(recordIDs, recordID)
  }

  return recordIDs, rows.Err() // Ensure no reading error occurred  
}

huangapple
  • 本文由 发表于 2022年5月26日 16:52:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/72389203.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定