Pgx go: jackc/pgx: PostgreSQL driver and toolkit for Go

Динамический запрос на получение в go с использованием pgx

Итак, я нашел это: https://betterprogramming.pub/dynamic-sql-query-with-go-8aedaa02907

, в нем объясняется, как создать динамический запрос для базового пакета sql. Я хотел бы сделать то же самое в pgx, но я не могу заставить его работать. Вот мой код:

 func (db *Database) Query (строка запроса, queryParams ... интерфейс {}) {
    строки, _ := db.conn.Query(context.Background(), запрос)
    отложить строки.Закрыть()
    описания полей := строки.Описания полей()
    переменные столбцы [] строка
    для _, fieldDesc := диапазон fieldDescriptions {
        столбцы = добавить (столбцы, строка (fieldDesc.Name))
    }
    строка := make([][]byte, len(cols))
    rowPtr := make([]interface{}, len(cols))
    для я: = ряд строк {
        строкаPtr[i] = &строка[i]
    }
    для строк.Далее() {
        ошибка := rows.Scan(rowPtr...)
        если ошибка != ноль {
            fmt.Println(ошибка.Ошибка())
        }
        fmt. Println(rowPtr)
    }
}
 

При этом я получаю сообщение об ошибке:

 не могу сканировать в dest[0]: не могу присвоить 1 в *[]uint8
 

Первый элемент в строке — это идентификатор, первый имеет 1, поэтому он пытается поместить int в *[]uint8, понятия не имею, что там происходит.

Если я удалю строку, заполните строку

 := make([][]byte, len(cols))
для я: = ряд строк {
    строкаPtr[i] = &строка[i]
}
 

и просто попытайтесь прочитать непосредственно в вариативный массив интерфейсов {} Я думал, что он будет читать в него, так как сканирование принимает интерфейс {}, но я просто получаю nil для всего. Кто-нибудь может пролить свет на что-либо из этого?

Это то, что вы ищете: https://github.com/DrakoRod/pgx-rowstojson/blob/master/main.go

https://github.com/jackc/pgx/issues/417

Копирование соответствующего раздела здесь для быстрой справки:

 // Преобразование pgx.Rows в объект json в формате []byte
func PgSqlRowsToJson (строки pgx. Rows) [] байт {
    описания полей := строки.Описания полей()
    переменные столбцы [] строка
    for _, col := range fieldDescriptions {
        столбцы = добавить (столбцы, строка (столбец.Имя))
    }
    количество: = длина (столбцы)
    tableData := make([]map[string]interface{}, 0)
    valuePtrs := make([]interface{}, count)
    для строк.Далее() {
        значения, _ := строки.Значения()
        для i, v := значения диапазона {
            valuePtrs[i] = Reflect.New(reflect.TypeOf(v)).Interface() // размещаем указатель на тип
        }
        ломать
    }
    для строк.Далее() {
        rows.Scan(valuePtrs...)
        запись := make(map[string]interface{})
        для i, столбец: = диапазон столбцов {
            вар v интерфейс {}
            val := Reflect.ValueOf(valuePtrs[i]).Elem().Interface() // указатель разыменования
            б, ок := знач.([]байт)
            если хорошо {
                v = строка (б)
            } еще {
                v = значение
            }
            запись[столбец] = v
        }
        tableData = добавить (tableData, запись)
    }
    jsonData, _ := json. Marshal(tableData)
    вернуть jsonData
}
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

postgresql — Использование pgx для подключения к базе данных postgres в Go

Задавать вопрос

спросил

Изменено
1 год, 7 месяцев назад

Просмотрено
8к раз

Я пытаюсь подключиться к своей базе данных postgres с помощью пакета jackc/pgx и следую предоставленному примеру. Проблема в том, что код зависает при вызове соединения. Я попытался напечатать что-то сразу после этого, и оно не печатается.

 var dbURL string = fmt.Sprintf("postgresql://%s:%s@%s:%s/%s", пользователь, пароль, хост, порт, имя базы данных)
fmt.Println(dbURL)
conn, err := pgx.Connect(context.Background(), dbURL)
если ошибка != ноль {
    fmt.Fprintf(os.Stderr, "Невозможно подключиться к базе данных: %v\n", ошибка)
    os.Выход(1)
}
отложить conn.Close(context.Background())
переменная текстовая строка
err = conn.QueryRow(context.Background(), "выбрать текст из вопросов, где id=$1", 1).Scan(&text)
если ошибка != ноль {
    fmt.Fprintf(os.Stderr, "Ошибка QueryRow: %v\n", ошибка)
    os.Выход(1)
}
fmt.Println(текст)
 

Вывод:

 postgresql://postgres:[email protected]:52269/имя_базы_данных
 

Что я делаю не так? Я могу подключиться к базе данных с помощью pgAdmin 4, и я подключился к нему, прежде чем использовать стандартный sql из go.

 connectionString := fmt.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *