Как мне назначить Postgres тип даты для переменной - PullRequest
0 голосов
/ 24 апреля 2020

Я вставляю даты истечения срока действия в Postgres в столбце с такой схемой:
exp DATE NOT NULL

То, как я создаю эти даты в Golang, зависит от "времени" "библиотека, которая использует тип данных Time (Не уверен, что ее базовый тип является строкой, документы go действительно не указали см. здесь ).

Вот как я делаю вставку с pgx библиотекой

expirationDate := time.Unix(expiresAt, 0)
sql := `
  insert into items 
  (sub, uuid, exp) 
  VALUES ($1, $2, $3)
`
_, err := connection.Exec(
  context.Background(),
  sql,
  subject,
  id,
  expirationDate,
)

Где-то еще в моем коде expiresAt сделано так:

days := 1 * 24 * time.Hour
expirationTime := time.Now().Add(days)
expirationTime.Unix() // this is what's being passed in my function (expiresAt int64) that does the DB insertion

Проблема пытается чтобы вернуть эту дату обратно из Postgres.
Когда я смотрю на нее в pgAdmin, я вижу, что она хранится как yyyy-mm-dd, поэтому я предположил, что могу назначить ее для строковой переменной, поэтому я попробовал это:

type RevokedRefreshToken struct {
  OldUUID           string
  OldExpirationDate string
}
var revokedRefreshToken RevokedRefreshToken
err := connection.QueryRow(context.Background(), "select uuid, exp from items where sub = $1", subject).
Scan(&revokedRefreshToken.OldUUID, &revokedRefreshToken.OldExpirationDate)

Я также пытался:
- тип int64
- тип времени
- не передавать его, используя адрес своей памяти (без функции & in Scan ())

Я до сих пор не могу понять тип данных, которому я должен присвоить это значение БД.
Вот ошибка, которую я получаю, я думаю, из pgx: can't scan into dest[1]: unable to assign to *string* 10 30 *

Какой тип данных мне нужно использовать, чтобы присвоить этому значению БД PostgreSQL тип даты

1 Ответ

1 голос
/ 24 апреля 2020

Если я правильно помню, pgx сопоставляет DATE с time.Time. Для сканирования вам либо нужен указатель на указатель, либо используйте pgx s pgtype.Date тип данных (я к ним привык, поэтому всегда их использую):

var dt pgtype.Date
err := conn.QueryRow("select exp from items where sub = $1", 1).Scan(&dt)

pgtype.Date имеет поле с именем Time типа time.Time, поэтому вы сможете нормально с ним работать. См. документацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...