C soci查询到自定义对象的向量

C++ SOCI query into vector of custom Object

本文关键字:对象 向量 自定义 soci 查询      更新时间:2023-10-16

当前我正在编写一个C 应用程序,必须在其中连接到SQLITE数据库。我搜索图书馆并找到了社会,我不得不说:我喜欢它。流语法和映射真是太棒了。但是我有一个问题:

我有一个事件课,我为此写了解析器函数:

template<> struct type_conversion<Event>
{
    typedef values base_type;
    static void from_base(const values& v, indicator /* ind */, Event& event)
    {
        event.m_id = v.get<std::string>("id");
        event.m_title = v.get<std::string>("Title");
        event.m_description = v.get<std::string>("Description");
        event.m_date = v.get<std::tm>("Date");
    }
    static void to_base(const Event& event, values& v, indicator& ind)
    {
        v.set("id", event.m_id);
        v.set("Title", event.m_title);
        v.set("Description", event.m_description);
        v.set("Date", event.m_date);
        ind = i_ok;
    }
};

这适用于这样的查询:

sql << "SELECT * FROM Event WHERE id=5", into(event); 

我想在std::vector<Event*>中选择大部分事件,但是如果我尝试以下方式:

std::vector<Event*> events;
sql << "SELECT * FROM Event", into(events)

但是,我会遵循编译器错误:

No known convertation from
soci::details::conversion_into_type<std::vector<Event>> into
soci::details::into_type_base

SOCI不可能,还是我错过了什么?我还发现OTL作为库。这可能是一个不错的选择吗?正如我说的那样,我喜欢这种社会方式。OTL是否也可以使用类似的事情?

soci不支持ORM与批量操作的组合。请参阅邮件列表线程:带有std ::向量不支持的ORM?。

相反,您可以使用基于Rowset和Iterator的访问:

rowset<Event> rs = (sql.prepare << "SELECT * FROM Event");
for (auto it = rs.cbegin(); it != rs.cend(); ++it)
{
   // access event
}

afair,仍然应该支持。