猿问

golang:将行 sql 转换为对象

您好,我正在使用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")

}

如果有人可以让我瞥见我如何使用此值对象将此行从银行传递到我的聚合的结构


慕桂英546537
浏览 119回答 1
1回答

明月笑刀无情

您可以使用类似这样的东西(尚未测试,需要优化):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}不要忘记在查询中的文本后添加逗号。passwordI am using entities and value objects without value object it seems easy using marshal,对不起,我不知道你的问题中的值对象。
随时随地看视频慕课网APP

相关分类

Go
我要回答