为了账号安全,请及时绑定邮箱和手机立即绑定

golang:将行 sql 转换为对象

golang:将行 sql 转换为对象

Go
慕桂英546537 2022-08-24 19:05:38
您好,我正在使用pgx来使用我的postgres,并且我对如何将数据库中的行转换为聚合有疑问。我正在使用没有值对象的实体和值对象,使用封送似乎很容易,但是使用值对象我认为导出字段不是一个好主意,然后我的问题来了,如何将我的行转换为聚合的结构我的聚合 :type Email struct {    address string}type Password struct {    value string}type Name struct {    firstName string    lastName  string}type Person struct {    Id       string    Name     valueObject.Name    Email    valueObject.Email    Password valueObject.Password    Created  time.Time    Updated  time.Time}func NewPerson(name valueObject.Name, email valueObject.Email, password valueObject.Password) *Person {    id := uuid.New()    return &Person{        Id:       id.String(),        Name:     name,        Email:    email,        Password: password,        Created:  time.Now(),        Updated:  time.Now(),    }}我所有的值对象都有一个通过模拟get的函数来获取私有值的方法,我没有放置我的值对象的其余代码,所以它不会变大从表中获取所有行的 func:func (r *personRepository) GetAll() (persons []*entities.Person, err error) {    qry := `select id, first_name, last_name, email, password created_at, updated_at from persons`    rows, err := r.conn.Query(context.Background(), qry)    return nil, fmt.Errorf("err")}如果有人可以让我瞥见我如何使用此值对象将此行从银行传递到我的聚合的结构
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您可以使用类似这样的东西(尚未测试,需要优化):


func (r *personRepository) GetAll() (persons []*entities.Person, err error) {

    qry := `select id, first_name, last_name, email, password, created_at, updated_at from persons`

    rows, err := r.conn.Query(context.Background(), qry)


  var items []*entities.Person

  if err != nil {

    // No result found with the query.

    if err == pgx.ErrNoRows {

        return items, nil

    }

    

    // Error happened

    log.Printf("can't get list person: %v\n", err)

    return items, err

  }


  defer rows.Close()


  for rows.Next() {

    // Build item Person for earch row.

    // must be the same with the query column position.


    var id, firstName, lastName, email, password string

    var createdAt, updatedAt time.Time

    

    err = rows.Scan(&id, &firstName, &lastName, &email,

                    &createdAt, updatedAt)

    if err != nil {

        log.Printf("Failed to build item: %v\n", err)

        return items, err

    }


    item := &entities.Person{

      Id: id,

      FirstName: firstName,

      // fill other value

    }


    // Add item to the list.

    items = append(items, item)

  }


  return items, nil

}

不要忘记在查询中的文本后添加逗号。password


I am using entities and value objects without value object it seems easy using marshal,


对不起,我不知道你的问题中的值对象。


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信