Как обновить несколько столбцов в таблице PostgresQL с помощью функции Go - PullRequest
1 голос
/ 05 апреля 2019

Я использую PostgresQL и Go.У меня есть таблица, которая называется users.Я пытаюсь написать функцию, которая сможет обновить несколько столбцов.Эта функция принимает имена столбцов и пользовательский объект (структура типа).Можете ли вы помочь мне с этим?

Это структура пользователя в 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
);

1-й пример: Я могу передать first_name & last_name + полный объект User (postgres должен обновить только эти 2 поля)

2-й пример: Я могу передать first_name & email & username + full Userобъект (postgres должен обновить только эти 3 поля)

Я пытался сделать это с картой, но не смог:

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

  }

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

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Вот моя функция обновления пользователя:

Я передаю структуру 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
}
0 голосов
/ 05 апреля 2019

Используйте ОБНОВЛЕНИЕ В примере я предполагаю, что вы написали функцию, которая принимает переменные.Допустим, что переменные:

  • firstName
  • lastName

Код 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...