干燥c ++结构

时间:2010-02-19 13:41:10

标签: c++ sqlite orm dry

我有一个在程序中广泛使用的简单c ++结构。现在我希望将结构作为单独的字段保存在sqlite数据库中(不要作为blob)。

有什么好的方法可以将结构的属性映射到数据库列?

6 个答案:

答案 0 :(得分:1)

由于C ++不是一种非常“动态”的语言,因此它缺少ORM's种,这些{{3}}通常可以在其他语言中找到,使这项任务变得轻松。

就个人而言,我总是不得不手动为每个表编写非常薄的包装类。基本上,您需要一个映射到每个表的结构和一个访问者类,以根据需要将数据输入和输出表。

结构应该每列有一个字段,您需要为要执行的每个数据库操作提供方法(例如CRUD)。

答案 1 :(得分:1)

一些解释/脚本语言(PHP等)支持“反思”,代码可以自我检查。这将允许数据库框架自动将struct成员序列化到数据库或从数据库序列化。不幸的是,C / C ++本身并不支持这一点。因此,除非您想将其存储为巨型BLOB(当然有缺点),否则您需要手动将结构的每个成员映射到db列。

唯一棘手的部分(除了耗时),是选择最适合C数据类型的db列类型。 (char [] - > varchar等)。正如jkp建议的那样,有一个瘦的包装类可以读/写每个持久化结构。

答案 2 :(得分:0)

一般来说很难回答。最简单的方法是每个属性一列,可能适用于您的应用程序,也可能不适合。

另一个极端是将它们全部合并为一列,具体取决于您将如何使用存储的数据。

也许使用其他一些持久性框架? sqlite可能不是最好的解决方案。

答案 3 :(得分:0)

我喜欢在数据结构字段和数据库字段之间使用一对一的关系。表中的每条记录代表一个完整的结构实例。唯一的例外是它是否会导致表中的过度去标准化。现在,为了从结构中获取数据到数据库,我实现了一个模板类,该模板类将结构作为模板参数。然后,我从模板派生出来,并将结构的get / set功能实现到数据库中。我将OTL library用于所有真正的数据库IO。这使得每种结构类型的特殊类的负担减少了干扰。

答案 4 :(得分:0)

我已经创建了一个字段和记录系统,现在基于复合设计模式。 Fields包含一个返回字段名称和可选字段类型(对于SQL语句)的方法。我目前正在将SQL内容移出现场并进入一个Visitor对象。

该记录包含一个返回表名的函数。

使用此方案,我可以在不知道字段或记录的详细信息的情况下创建SQL表。我只是在基类中调用多态方法。

我尝试过其他技术,但我的代码已演变为此实现。

答案 5 :(得分:0)

与其他一些答案相反,我说这项任务可以实现自动化。例如。看看quince(http://quince-lib.com)。它可以让你做这样的事情:

struct point {
    float x;
    float y;
};
QUINCE_MAP_CLASS(point, (x)(y))

extern database db;
table<point> points(db, "points");

(完全披露:我写了quince。)