Задать вопрос
@setupx
Go & TS developer

Работа с NULL в PostgreSQL?

Вот моя таблица 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. И так вопрос, какой из двух методов наиболее безопасный для работы далее, чтобы не вставлять себе палки в колеса и какие плюсы разных методов?
  • Вопрос задан
  • 39 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы