Образец структуры
type Car struct {
ID uint64
Required bool `pg:"required,notnull"`
Name string `pg:"name"`
}
Миграция:
BEGIN;
ALTER TABLE cars ADD COLUMN required BOOLEAN NOT NULL DEFAULT true;
END;
Когда я создаю структуру автомобиля:
car = Car{Name:"Name",Required:false}
Когда я пытаюсь добавить новую машину, написав:
_, err = r.db.Model(&car).Insert()
SQL-запрос выглядит так:
INSERT INTO "cars" ("id", "name", "required") VALUES (DEFAULT, "Name", DEFAULT)
Основная проблема в том, что у автомобиля обязательное поле установлено как false, но когда я его вставляю - оно меняется на DEFAULT (true).
Не беда) Это была моя опечатка
Этот SQL-запрос не может быть правильным. "Name"
— столбец Name
. 'Name'
— строковое значение Name
. Должно быть VALUES (DEFAULT, 'Name', DEFAULT)
. Так что же такое настоящий запрос и настоящий код?
Потому что значение false
будет прочитано как нулевое значение. Поскольку нулевое значение, ваши данные будут изменены на значение по умолчанию (ИСТИНА)
Вы должны изменить структуру, чтобы она понравилась
type Car struct {
ID uint64
Required *bool `pg:"required,notnull,default:true"`
Name string `pg:"name"`
}
и определите структуру, подобную этой
required := false
car = Car{Name:"Name", Required: &required}
или вы также можете использовать тип данных sql.NullBool
в своей структуре
type Car struct {
ID uint64
Required sql.NullBool `pg:"required,notnull,default:true"`
Name string `pg:"name"`
}
car = Car{Name:"Name", Required: sql.NullBool{Bool: false, Valid: true}}
Основная проблема заключается в том, что когда я пытаюсь добавить много автомобилей без указания обязательного поля, я хочу, чтобы оно было обязательным как истинное. Ваше решение в этом случае устанавливает для всех автомобилей значение false (
@kyrkela добавьте тег default:true в свою структуру, чтобы принудительно указать требуемое значение как true, если поле не установлено. я уже обновил свой ответ
Вы создаете Автомобиль с помощью
required
, но поле структурыRequired