Помогите зафиксить ошибку "postgres error SQLSTATE 26000"
Проблема в следующем:
SELECT id,
planned_servers,
country_id,
traffic_manager_active,
proxy_id,
execution_date,
status,
created_at,
updated_at,
deleted_at
FROM schedules
WHERE execution_date <= now()
AND status = $1
AND deleted_at IS NULL
при попытке выполнить вышеописанный селект из базы данных, бд возвращает ошибку "ERROR: prepared statement "lrupsc_1_0" does not exist (SQLSTATE 26000)"
данная ошибка начала появлятся после обновления версии постгрес на сервере
В качестве ЯП используется Go для работы с постгрес библиотека https://github.com/jackc/pgx
Ответы (1 шт):
Проблема была в том что по умолчанию https://github.com/jackc/pgx кеширует подготовленные выражения и пытается потом вызывать их на уровне постгрес Постгрес же постоянно обновляет конекшн (а хранит подготовленные выражения только в рамках одного конекшна) Вот и получилась ситуация в которой драйвер все еще хранит prep statement, а в базе его нет.
Решение:
использовать SimpleProtocol при подключении к базе
func OpenPGX(pgConnString string) (*pgx.Conn, error) {
connConfig, err := pgx.ParseConfig(pgConnString)
if err != nil {
return nil, err
}
connConfig.PreferSimpleProtocol = true // disable prepared statements caching by default
return pgx.ConnectConfig(context.Background(), connConfig)
}