我使用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_name
和last_name
+完整的User对象(postgres应该只更新这两个字段)
第二个示例:我可以传递first_name
和email
和username
+完整的用户对象(postgres应该只更新这三个字段)
我试图用map来做,但是我做不到:
func UpdateUser(db *sql.DB, m map[string]interface{}) (*User, error) {
for key, value := range m {
}
err := db.QueryRow(UPDATE "users" SET ())
}
答案 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]
等这只是意味着用户将不得不一次输入一项。
答案 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
}