Gorm: дубликат ключа pq нарушает уникальное ограничение - PullRequest
1 голос
/ 09 апреля 2020

Я сейчас пытаюсь выучить go & Gorm, поэтому извиняюсь, если упускаю что-то очевидное.

Я объявил следующие модели GORM

type User struct {
    gorm.Model
    DiscordID            string `gorm:"unique"`
    SteamID              string `gorm:"unique"`
    SteamID64            uint64 `gorm:"unique"`
    DiscordNickname      string
    DiscordProfilePicURL string
}

type DeepLink struct {
    gorm.Model
    ShortURL   string `gorm:"unique"`
    UserID     uint
    User       User
    LinkAction Action
    Payload    interface{} `gorm:"-"`
}

Я хочу чтобы иметь возможность идентифицировать пользователя, который создал диплинк - это может быть не лучшим способом сделать это.

При создании новой базы данных при создании второго пользователя с помощью

func (m *Models) CreateUserFromDiscord(discordID, discordNickname, discordProfilePicURL string) *User {
    u := &User{
        DiscordID:            discordID,
        DiscordNickname:      discordNickname,
        DiscordProfilePicURL: discordProfilePicURL,
    }

    m.db.Create(u)
    return u
}

Я получаю сообщение об ошибке: pq: duplicate key value violates unique constraint "users_steam_id_key"

Создание первого пользователя с использованием этого метода и создание глубоких ссылок для этого пользователя работает нормально, но создание второго пользователя приводит к ошибке. Ни у одного пользователя не установлен SteamID.

Мне интересно, есть ли способ исправить эту или улучшить структуру моих моделей для решения этой проблемы.

База данных создается с помощью функции Gorms AutoMigrate. Это происходит на новом БД

Спасибо

1 Ответ

0 голосов
/ 09 апреля 2020

В golang, если вы не установите значение для строковой переменной, это означает, что ее значение равно «» (пустая строка). Ref

Поскольку вы не установили SteamID, тогда "" (пустая строка) устанавливается как значение для первого пользователя. Затем, когда вы пытаетесь сохранить второй пользовательский столбец SteamID как "" (пустой), тогда уникальное ограничение нарушается, потому что "" (пустая строка) является ненулевым значением для базы данных и выдает ошибку.

Решение : Используйте * (указатель) для этих полей в структуре. Если переменная * string / * int64 не установлена, то это значение nil. Также сделайте необязательные столбцы обнуляемыми в БД.

type User struct {
    gorm.Model
    DiscordID            string `gorm:"unique"`
    SteamID              *string `gorm:"unique"`
    SteamID64            *uint64 `gorm:"unique"`
    DiscordNickname      string
    DiscordProfilePicURL string
}
...