Вот моя таблица users, в которых могут быть NULL значения:
spoiler
CREATE TABLE users
(
id BIGSERIAL PRIMARY KEY,
last_name VARCHAR(64) DEFAULT NULL,
first_name VARCHAR(64) DEFAULT NULL,
phone_code_id INT REFERENCES country_codes (id) ON DELETE RESTRICT DEFAULT NULL,
phone VARCHAR(32) UNIQUE DEFAULT NULL,
email VARCHAR(320) UNIQUE DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
deleted_at TIMESTAMP DEFAULT NULL
);
И я записываю в такую структуру и вроде бы все хорошо:
code
type User struct {
ID int64 `json:"id"`
LastName *string `json:"last_name"`
FirstName *string `json:"first_name"`
PhoneCodeID *int64 `json:"phone_code_id"`
Phone *string `json:"phone"`
Email *string `json:"email"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt *time.Time `json:"deleted_at"`
}
Но посмотрев у других разработчиков, я увидел, что некоторые используют:
1) sql.NullString (с дефолтной библиотеки database/sql)
2) pgtype.Text (библиотека для pgx)
И у меня получается вот такое:
code
type UserSQL struct {
ID pgtype.Int8 `json:"id" db:"id"`
LastName pgtype.Text `json:"last_name" db:"last_name"`
FirstName pgtype.Text `json:"first_name" db:"first_name"`
PhoneCodeID pgtype.Int8 `json:"phone_code_id" db:"phone_code_id"`
Phone pgtype.Text `json:"phone" db:"phone"`
Email pgtype.Text `json:"email" db:"email"`
CreatedAt pgtype.Timestamptz `json:"created_at" db:"created_at"`
UpdatedAt pgtype.Timestamptz `json:"updated_at" db:"updated_at"`
DeletedAt pgtype.Timestamptz `json:"deleted_at" db:"deleted_at"`
}
func (u *UserSQL) ToUser() *User {
var user User
user.ID = u.ID.Int64
if u.LastName.Valid {
user.LastName = &u.LastName.String
} else {
user.LastName = nil
}
if u.FirstName.Valid {
user.FirstName = &u.FirstName.String
} else {
user.FirstName = nil
}
if u.PhoneCodeID.Valid {
user.PhoneCodeID = &u.PhoneCodeID.Int64
} else {
user.PhoneCodeID = nil
}
if u.Phone.Valid {
user.Phone = &u.Phone.String
} else {
user.Phone = nil
}
if u.Email.Valid {
user.Email = &u.Email.String
} else {
user.Email = nil
}
user.CreatedAt = u.CreatedAt.Time
user.UpdatedAt = u.UpdatedAt.Time
if u.DeletedAt.Valid {
user.DeletedAt = &u.DeletedAt.Time
} else {
user.DeletedAt = nil
}
return &user
}
type User struct {
ID int64 `json:"id"`
LastName *string `json:"last_name"`
FirstName *string `json:"first_name"`
PhoneCodeID *int64 `json:"phone_code_id"`
Phone *string `json:"phone"`
Email *string `json:"email"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt *time.Time `json:"deleted_at"`
}
т.е структура UserSQL используется только для получения данных с БД, а далее для ответа от API и обработки использую User. И так вопрос, какой из двух методов наиболее безопасный для работы далее, чтобы не вставлять себе палки в колеса и какие плюсы разных методов?