Postgres не смог определить тип данных параметра $1 в приложении Golang
Я создаю приложение в Golang, которое использует Postgres, используя драйвер pq. Я хочу создать функцию, которая может выбирать пользовательское поле из моей базы данных, но я получаю сообщение об ошибке:
pq: не удалось определить тип данных параметра $1
Ниже приведен код, который сгенерировал эту ошибку:
var ifc interface{}
if err := conn.QueryRow("SELECT $1 FROM "+db+" WHERE uuid=$3 OR uri=$4 LIMIT 1", field, UUIDOrURI, UUIDOrURI).Scan(&ifc); err != nil {
if err == sql.ErrNoRows {
return http.StatusNotFound
}
log.Println(err)
return http.StatusInternalServerError
}
Почему я не могу вставить поле, которое я хочу SELECT
с помощью $1
? Есть ли другой способ сделать это?
2 ответа
Вы не можете использовать заполнители для имен полей. Вам нужно будет построить запрос напрямую, как в:
"SELECT `" + field + "` FROM "
Чтобы избежать SQL-инъекций, убедитесь, что поле является частью списка разрешенных полей заранее.
ИМХО более простой, но не безопасный способ создания SQL-запросов - использовать fmt.Sprintf:
query := fmt.Sprintf("SELECT %s FROM %s WHERE uuid=%s", field, db, UUIDOrURI)
if err := conn.QueryRow(query).scan(&ifc); err != nil {
}
Вы даже можете указать индекс аргумента:
query := fmt.Sprintf("SELECT %[2]s FROM %[1]s", db, field)
Чтобы облегчить разработку, я рекомендую использовать пакет для связи с postgresql, я попробовал этот и работал отлично.