【问题标题】:C++ SOCI query into vector of custom ObjectC++ SOCI 查询到自定义对象的向量
【发布时间】:2017-02-15 22:06:47
【问题描述】:

目前我正在编写一个必须连接到 SQLite 数据库的 C++ 应用程序。我搜索了一个图书馆,发现了 SOCI,我不得不说:我喜欢它。流语法和映射非常棒。但我有一个问题:

我有一个 Event 类,我已经为它编写了解析器函数:

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&lt;Event*&gt; 中选择大量事件,但如果我尝试这样做:

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 作为库。这可能是一个不错的选择吗?正如我所说,我喜欢 SOCI 方式。 OTL 也可以实现类似的功能吗?

【问题讨论】:

    标签: c++ soci


    【解决方案1】:

    SOCI 不支持 ORM 与批量操作的组合。请参阅邮件列表线程:ORM with std::vector not supported?

    相反,您可以使用基于行集和迭代器的访问:

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

    AFAIR,还是应该支持的。

    【讨论】:

    • 非常感谢您!我还有两个问题:如果我再次执行相同的查询,SOCI 是否会在后台缓存对象?将rowset 声明为朋友的正确方法是什么,以便我可以将默认构造函数设为私有?我试过friend class soci::rowset&lt;Event&gt;,但这不起作用。
    • SOCI 在发出单独的查询之间不缓存任何内容。用于专门化行集的类型必须是默认可构造的。
    • 如果行集是我班级的朋友并且构造函数是私有的,它应该是默认可构造的还是我误解了你?
    • Event 不能有私有构造函数。这是rowset(和内部rowset_impl 类)的要求。看看 SOCI 代码,你就会明白为什么(即new T())。您可以随时根据需要修改 SOCI 代码。
    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2019-11-28
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多