Как избежать того, что 0 (ноль) int превращается в «нулевое» значение Postgres и нарушает ограничение «не ноль»? - PullRequest
2 голосов
/ 14 апреля 2019

В Go я распаковываю / декодирую JSON в структуру с полем идентификатора типа int.Затем я пытаюсь вставить эту структуру в базу данных PostgreSQL, используя go-pg со столбцом ID в качестве первичного ключа (который имеет ненулевое ограничение).Первая запись имеет 0 в качестве идентификатора.В документации Postgres говорится, что 0 подходит как значение первичного ключа.Тем не менее, я получаю сообщение об ошибке:

«ОШИБКА # 23502 нулевое значение в столбце« число »нарушает ограничение не-ноль».

Похоже, 0 превращается в "нулевое значение" Go, когда оно не маршалируется в значение int.Затем он вставляется как значение null в Postgres.Буду очень признателен за любые советы, как мне этого избежать.

type Account struct {
   Number int `sql:"type:smallint, pk"`
   Name string
}

[...]

account := Account{}
err := json.NewDecoder(r.Body).Decode(&account)

[...]

insertErr := pgLayer.db.Insert(&account)
if insertErr != nil {
   log.Printf("Error while inserting new item")
   return "n/a", insertErr
}

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Хотя с go-pg это не сразу очевидно, вы можете использовать тег struct sql:",notnull", чтобы показать, что значения Go empty ("", 0, [] и т. Д.) Разрешены и не должны рассматриваться какSQL NULL.

Вы можете увидеть это в списке функций .

В вашем случае я бы изменил это на:

type Account struct {
   Number int `sql:"type:smallint,pk,notnull"`
   Name string
}
0 голосов
/ 15 апреля 2019

Я думаю, что самое простое решение вашей проблемы - создать столбец ID типа SERIAL и позволить Postgres заняться настройкой и автоматическим увеличением значения для вас. Если вам нужно значение в вашем приложении непосредственно после его вставки, вы всегда можете использовать предложение RETURNING psql, например:

INSERT INTO shows(
    user_id, name, description, created, modified
) VALUES(
    :user_id, :name, :created, :modified
) RETURNING id;

И запишите ответ в вашем коде.

...