Я прототипирую конечные точки REST поверх существующей производственной базы данных и застрял в столбце даты и времени, обнуляемом с нулем.Я уже читал темы типа Nullable time.Time в golang или Извлечение значения даты и времени NULL в MySQL с помощью GORM , но не могу POST создать новый объект в конечную точку REST и сохранить незарегистрированные даты и времениатрибут из JSON как NULL в MariaDB.
Я отправляю HTTP-запрос наподобие
POST /countries
{ "iso_code" : "CZ", "title" : "Czechia" }
Таблица имеет следующую схему
create table country
(
iso_code char(2) not null comment 'Country alpha-2 ISO code'
primary key,
title varchar(255) null comment 'Country name',
created_on datetime default current_timestamp() not null,
updated_on datetime null on update current_timestamp()
)
Я уже пробовал mysql.Тип NullTime, тип time.Time в качестве указателя, указывающий sql: DEFAULT: NULL в отображении, отображение gorm: "null", я также непосредственно назначил nil в newCountry.UpdatedAt прямо перед его сохранением.Хук Хормса BeforeSave также не имел значения.
Режим довольно явный
type Country struct {
IsoCode string `json:"iso_code" gorm:"primary_key" sql:"size:2"`
Title *string `json:"title,omitempty" gorm:"null" sql:"size:255"`
CreatedAt *time.Time `json:"created_at,omitempty" gorm:"column:created_on"`
UpdatedAt *time.Time `json:"updated_at,omitempty" gorm:"column:updated_on;null" sql:"DEFAULT:NULL"`
}
Я использую GORM для хранения объекта
func CreateCountry(country *m.Country) *m.Country {
fmt.Println(country)
existingCountry := GetCountry(country.IsoCode)
if existingCountry == nil {
err := GetDB().Create(country).Error
// ...
}
// ...
}
Здесь в методеСтрана не имеет значения для UpdatedAt
, но вызывается Create(country)
, она хранит точное значение для обоих столбцов даты и времени.
Я читаю это из тела HTTP-запроса, как это
var CreateCountry = func(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.Body)
newCountry := &m.Country{}
err := json.NewDecoder(r.Body).Decode(newCountry)
// ...
}
Также здесь тело имеет ноль в атрибутах datetime.
Не уверен, что еще можно сделать, чтобы создать оператор вставки, например
INSERT INTO `country` (`iso_code`,
`title`,`created_on`,`updated_on`) VALUES (?,?,?,?)[KR 0xc0001f6130 null null]
, а не
INSERT INTO `country` (`iso_code`,
`title`,`created_on`,`updated_on`) VALUES (?,?,?,?)[KR 0xc0001f6130 2019-03-31 03:16:41.5158848 +0200 CEST m=+16.4487208
01 2019-03-31 03:16:41.5158848 +0200 CEST m=+16.448720801]