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.