Нужен совет по архитектуре запросов из бд postgresql на golang
Есть API, на запросе выдает json в следующем виде { name: "somename", note: "somenote" }
Структура выглядит таким образом:
type Entity struct {
Name string `json:"name"`
Note string `json:"note"`
}
Соответственно, подключив пакет драйвера pq, и пакет database/sql, я делаю запрос из бд (обработку ошибок опустил для примера):
entity := Entity{}
row := postgresql.Db.QueryRow("SELECT name, note FROM somedata WHERE name = 'somename'")
row.Scan(&entity.Name, &entity.Note);
...
... c.JSON(entity)
В базе данных Name имеет not null ограничение, а Note может быть null.
Scan присваивает значения по адресам правильно... до тех пор пока в БД параметр Note не null
. Т.к. string не может быть null
, то соответственно выбрасывает ошибку. И тут есть 5-6 решений, которые можно разделить на 2 вида:
- Добавить дополнительную логику при запросе, как я и сделал с помощью
sql.NullString
var note sql.NullString
row := postgresql.Db.QueryRow("SELECT name, note FROM somedata WHERE name = 'somename'")
row.Scan(&entity.Name, ¬e);
// Valid не использую поскольку пустой строки достаточно
entity.Note = note.String
... c.JSON(entity)
Есть и другие решения связанных с доп. кодом, и всякие страшные обёртки, но и тут всё работает нормально, правда не знаю как быть если будет не 1 nullable string
, а например 30.
- Если есть возможность, изменить БД таким образом, что бы не было nullable столбцов, но тут скорее вопрос насколько это обосновано на каждый столб вешать not null, что с философией реляционнки, производительностью или потреблением памяти. Может если отправка в JSON, имеет смысл?
Хочу узнать мнение, как лучше именно в этом случае? Может кто-то работал над средним или крупным проектом и подскажет как они реализовали запросы.