计算 ODB 查询返回的结果数的最佳方法是什么?
What is the optimal way to count the number of results that would be returned by an ODB query?
我有一个使用 ODB 和 SQLite 数据库的 C++ 应用程序。我想计算任何查询返回的结果数。目前,我正在做类似以下的事情:
using query = odb::query<person>;
auto filteredResults( db.query<person>(query::first == "John") );
const auto count = std::distance( filteredResults.begin(), filteredResults.end() );
有没有更有效的方法来计算返回的查询结果数?
我知道 SQLite 提供了 COUNT 函数(https://www.sqlitetutorial.net/sqlite-count-function/) that appears to be more efficient, but is there a way to invoke this via ODB, or would I need to re-write the query in native SQLite (https://www.codesynthesis.com/products/odb/doc/manual.xhtml#3.12)?
对于我的情况,答案是使用 ODB 视图 (https://www.codesynthesis.com/products/odb/doc/manual.xhtml#10)。
此代码设置视图。
#pragma db view object(person)
struct PersonCount
{
#pragma db column("COUNT(" + person::first + ")")
std::size_t numPeople;
};
然后它可以用来计算匹配给定查询的人数。
transaction t( db.begin() );
PersonCount pc( db.query_value<PersonCount>( query::first == "John" ) );
t.commit();
cout << pc.numPeople << '\n';
我有一个使用 ODB 和 SQLite 数据库的 C++ 应用程序。我想计算任何查询返回的结果数。目前,我正在做类似以下的事情:
using query = odb::query<person>;
auto filteredResults( db.query<person>(query::first == "John") );
const auto count = std::distance( filteredResults.begin(), filteredResults.end() );
有没有更有效的方法来计算返回的查询结果数?
我知道 SQLite 提供了 COUNT 函数(https://www.sqlitetutorial.net/sqlite-count-function/) that appears to be more efficient, but is there a way to invoke this via ODB, or would I need to re-write the query in native SQLite (https://www.codesynthesis.com/products/odb/doc/manual.xhtml#3.12)?
对于我的情况,答案是使用 ODB 视图 (https://www.codesynthesis.com/products/odb/doc/manual.xhtml#10)。
此代码设置视图。
#pragma db view object(person)
struct PersonCount
{
#pragma db column("COUNT(" + person::first + ")")
std::size_t numPeople;
};
然后它可以用来计算匹配给定查询的人数。
transaction t( db.begin() );
PersonCount pc( db.query_value<PersonCount>( query::first == "John" ) );
t.commit();
cout << pc.numPeople << '\n';