Получить результаты из запроса sql только при применении функции к полю. Это ошибка Poco::Data?

Я использую Poco::Data (версия 1.8.1) для запроса базы данных sqlite (версия 3.27), компилируемой с помощью gcc версии 7.3.0 для onion omega2 (mips) под управлением openwrt 18.06.
У меня странное поведение .
Когда я выполняю запрос типа

select <real field> from ...

У меня есть исключение "NotFound" (запрос из командной строки возвращает результат, конечно).
Если я применю к нему функцию типа "avg", например, у меня будет правильный результат.
Этого не происходит с целочисленным полем. Имя поля "пси": я думаю, что это не зарезервированное слово. Это ошибка Poco::Data? Я что-то делаю не так?

Код, который я использую:

double result;
std::string query = "select <field> from table where <condition on pk>";
session << query, into(result), now;

этот код дает NotFound.

Изменение строкового запроса на:

std::string query = "select avg(<field>) from table where <condition on pk>";

оно работает.


person abiuan    schedule 02.06.2019    source источник


Ответы (1)


Скорее всего, ваш запрос возвращает более одной строки результатов. В этом случае into(result) завершится ошибкой, если result является скалярным значением. Попробуйте добавить limit(0, 1), например:

session << query, into(result), limit(1), now;

чтобы вернуть только одну строку результата. Однако это может быть не то, что вам нужно, поскольку в основном вы получите случайную строку результата, соответствующую вашему запросу. Если вы хотите все, вы можете использовать вектор для получения результата, как в:

std::vector<double> result;
session << query, into(result), now;

Существуют также другие варианты получения многострочного результата, например. проход по всем строкам результатов, выполняя оператор несколько раз или используя RecordSet. См. Привязка и RecordSet для получения подробной информации.

person Günter Obiltschnig    schedule 02.06.2019
comment
Нет, проблема в другом. Запросы, которые я использую, относятся к первичным ключам, поэтому они всегда возвращают скалярное значение, и это хорошо работает, если я использую такую ​​функцию, как приведение (например, приведение (поле как двойное)). Я предполагаю, что это проблема с тем, как Poco::Data обрабатывает реальный тип данных. Выполнение простого запроса, такого как select * from ‹table›, если ‹table› содержит поля реального типа данных, вызов выдает исключение notfound. Очевидно, что если я запускаю запросы в командной строке, все работает нормально. - person abiuan; 04.06.2019
comment
Проверьте, действительно ли тип данных столбца REAL. Poco::Data::SQLite имеет фиксированный набор имен поддерживаемых типов, проверьте Utility.cpp для списка. - person Günter Obiltschnig; 11.06.2019