Sqlx Get с подготовленными заявлениями - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь получить некоторые данные из таблицы 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 Ответ

0 голосов
/ 05 мая 2018

Документация для sqlx описана Получить и выбрать как:

Get и Select используют rows.Scan для сканируемых типов и rows.StructScan on не сканируемые типы. Они примерно аналогичны QueryRow и Query, где Get полезен для извлечения одного результата и его сканирования, и Выбор полезен для получения фрагмента результатов:

Для извлечения одной записи используйте 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. Это будет работать.

...