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, я попробовал этот и работал отлично.

Другие вопросы по тегам