Sqlx Get с подготовленными заявлениями
Я пытаюсь получить некоторые данные из таблицы postgress, используя подготовленные заявления
Если я пытаюсь с базой данных.Get() все возвращается.
Таблица:
create table accounts
(
id bigserial not null
constraint accounts_pkey
primary key,
identificator text not null,
password text not null,
salt text not null,
type smallint not null,
level smallint not null,
created_at timestamp not null,
updated timestamp not null,
expiry_date timestamp,
qr_key text
);
Структура аккаунта:
type Account struct {
ID string `db:"id"`
Identificator string `db:"identificator"`
Password string `db:"password"`
Salt string `db:"salt"`
Type int `db:"type"`
Level int `db:"level"`
ExpiryDate time.Time `db:"expiry_date"`
CreatedAt time.Time `db:"created_at"`
UpdateAt time.Time `db:"updated_at"`
QrKey sql.NullString `db:"qr_key"`
}
Кстати, я пытался использовать? вместо $1 и $2
stmt, err := database.Preparex(`SELECT * FROM accounts where identificator = $1 and type = $2`)
if err != nil {
panic(err)
}
accounts := []account.Account{}
err = stmt.Get(&accounts, "asd", 123)
if err != nil {
panic(err)
}
Я получаю ошибку
"errorMessage": "сканируемый фрагмент типа dest с \u003e1 столбцами (10) в результате",
В таблице нет записей, я пытался удалить все поля, кроме идентификатора из учетной записи (структура), однако это не работает.
1 ответ
Документация для sqlx описана как Get и Select как:
Get
а такжеSelect
используйте rows.Scan для сканируемых типов и rows.StructScan для не сканируемых типов. Они примерно аналогичны QueryRow и Query, где Get полезен для извлечения одного результата и его сканирования, а Select полезен для извлечения фрагмента результатов:
Для извлечения одной записи используйте Get
,
stmt, err := database.Preparex(`SELECT * FROM accounts where identificator = $1 and type = $2`)
var account Account
err = stmt.Get(&account, "asd", 123)
Если ваш запрос возвращает более одной записи, используйте Select
с заявлением как:
stmt, err := database.Preparex(`SELECT * FROM accounts where identificator = $1 and type = $2`)
var accounts []Account
err = stmt.Select(&accounts, "asd", 123)
В вашем случае, если вы используете stmt.Select
вместо этого, если stmt.Get
, Это будет работать.