如何使用Go函数更新PostgresQL表中的几列

时间:2019-04-05 14:26:34

标签: sql postgresql go

我使用PostgresQL和Go。我有一个名为users的表。我尝试编写一个能够更新几列的函数。此函数采用列名和用户对象(类型struct)。你能帮我吗?

这是Go中的用户结构:

type User struct {
  ID          int       json:"id"
  Username    string    json:"username"
  Password    string    json:"password"
  FirstName   string    json:"first_name"
  LastName    string    json:"last_name"
  Email       string    json:"email"
}

这是创建用户表的SQL脚本:

create table "users"
(
  id                       serial       not null
  constraint user_pk
  primary key,
  username                 varchar(64)  not null,
  password                 varchar(128) not null,
  first_name               varchar(64)  not null,
  last_name                varchar(64)  not null,
  email                    varchar(64)  not null
);

第一个示例:我可以传递first_namelast_name +完整的User对象(postgres应该只更新这两个字段)

第二个示例:我可以传递first_nameemailusername +完整的用户对象(postgres应该只更新这三个字段)

我试图用map来做,但是我做不到:

func UpdateUser(db *sql.DB, m map[string]interface{}) (*User, error) {
  for key, value := range m {

  }

  err := db.QueryRow(UPDATE "users" SET ())
}

2 个答案:

答案 0 :(得分:0)

使用UPDATE 在示例中,我假设您已经编写了函数,该函数带有变量。假设变量为:

  • 名字
  • 姓氏

SQL代码如下:

UPDATE users
SET first_name = firstName, last_name= lastName
WHERE [condition] 

您可能会发现需要为此使用重载的构造函数编写一个类,以便它可以接收任意数量的所需变量。

或者最好还是为每行写一个函数:

UPDATE users
SET first_name = firstName
WHERE [condition] 

UPDATE users
SET last_name= lastName
WHERE [condition]

等这只是意味着用户将不得不一次输入一项。

https://www.w3schools.com/sql/sql_update.asp

答案 1 :(得分:0)

这是我的用户更新功能:

我将User结构传递给该函数,并且不必担心需要更新哪些字段,我只需将它们全部更新即可。调用者正在与他们从以前的函子中获得的用户一起工作,该函子是从数据库返回的(如果需要,我将向您显示API处理程序)。

更新后,我调用Get函数从数据库中获取新近更新的记录并返回User结构。可以肯定的是,呼叫者可以准确看到他们刚刚所做的事情。

// Update a User identified by id
func (u *UserModel) Update(user *models.User) (*models.User, error) {
    stmt := `UPDATE user SET
            first_name = ?,
            last_name = ?,
            email = ?,
            phone = ?,
            status_id = ?
        WHERE id = ?`

    var userStatus models.UserStatus
    userStatusID := userStatus.GetID(user.Status)

    _, err := u.DB.Exec(stmt, user.FirstName, user.LastName, user.Email, user.Phone, userStatusID, user.ID)
    if err != nil {
        if mysqlErr, ok := err.(*mysql.MySQLError); ok {
            if mysqlErr.Number == 1062 && strings.Contains(mysqlErr.Message, "uk_user_email") {
                return nil, models.ErrDuplicateEmail
            }
        }
        return nil, err
    }

    user, err = u.Get(int(user.ID))
    if err != nil {
        return nil, err
    }

    return user, nil
}