Нужен совет по архитектуре запросов из бд postgresql на golang

Рейтинг: 0Ответов: 0Опубликовано: 19.04.2023

Есть 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 вида:

  1. Добавить дополнительную логику при запросе, как я и сделал с помощью sql.NullString
var note sql.NullString

row := postgresql.Db.QueryRow("SELECT name, note FROM somedata WHERE name = 'somename'")
row.Scan(&entity.Name, &note);

// Valid не использую поскольку пустой строки достаточно
entity.Note = note.String

... c.JSON(entity)

Есть и другие решения связанных с доп. кодом, и всякие страшные обёртки, но и тут всё работает нормально, правда не знаю как быть если будет не 1 nullable string, а например 30.

  1. Если есть возможность, изменить БД таким образом, что бы не было nullable столбцов, но тут скорее вопрос насколько это обосновано на каждый столб вешать not null, что с философией реляционнки, производительностью или потреблением памяти. Может если отправка в JSON, имеет смысл?

Хочу узнать мнение, как лучше именно в этом случае? Может кто-то работал над средним или крупным проектом и подскажет как они реализовали запросы.

Ответы

Ответов пока нет.