一个好的面向对象的C++封装SQLite的库是什么?

70

我想找一个好的面向对象的C++(而不是C)封装来使用sqlite。人们有什么推荐吗?如果您有多个建议,请将它们放在单独的回复中以便投票。此外,请指出您对所建议的封装是否有任何经验,并说明您如何使用它。


1
还可以查看以下列表:http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers - User
14个回答

56

这可能会招致负评,但我还是要说...

我直接从C++中使用sqlite,不认为添加一个C++抽象层有任何价值。现在它已经非常好了(而且高效)。


9
你只因两个踩而失去了-4分,我给你点了赞。使用C接口肯定是一个选择,也很可能是我们选择的那个选项。当然,我们可能会使用一些轻量级的C++封装器,比如boost::shared_ptr和自定义删除器,以及异常处理来处理错误,但并不需要一个庞大的API。 - CashCow
@CashCow:是的 - 谢谢 - 我也是这么做的。 - Johan Kotlinski
2
同样地,最终,这也是我们拥有的最理智的选择。 - WhozCraig

19

另一个适用于C ++数据库的良好封装是SOCI。它不是非常面向对象,但更加现代化。

它支持Oracle、PostgreSQL和MySQL。在CVS中有一个SQLite后端


18

我读了这篇文章并尝试了其中提到的一些库,但它们中没有一个对我来说足够简单(我是一个懒惰的程序员!)。

所以我写了自己的包装器:sqlite modern cpp

database db("dbfile.db");
// executes the query and creates a 'user' table if not exists
db << "create table if not exists user ("
      "   age int,"
      "   name text,"
      "   weight real"
      ");";
// inserts a new user and binds the values to '?' marks
db << "insert into user (age,name,weight) values (?,?,?);"
        << 20
        << "bob"
        << 83.0;
// slects from table user on a condition ( age > 18 ) and executes 
// the lambda for every row returned .
db << "select age,name,weight from user where age > ? ;"
   << 18
   >> [&](int age, string name, double weight) {
       cout << age << ' ' << name << ' ' << weight << endl;
   };
// selects the count(*) of table user
int count = 0;
db << "select count(*) from user" >> count;

玩得开心!


13

这个库已经有一段时间没有更新了,但是可以在 Mac OS GCC 4.3 上编译并运行。此外,它还采用 MIT 许可证发布,因此您可以在商业项目中使用它,没有问题。http://code.google.com/p/sqlite3pp/

使用方法很简单和清晰:

sqlite3pp::database db("test.db");
sqlite3pp::transaction xct(db);
{
    sqlite3pp::command cmd(db, "INSERT INTO contacts (name, phone) VALUES (:user, :phone)");
    cmd.bind(":user", "Mike");
    cmd.bind(":phone", "555-1234");
    cmd.execute();
}
xct.rollback();

查看:http://code.google.com/p/sqlite3pp/wiki/UsagePage


11

使用Qt - 它有很好的SQLite绑定,可以很好地融入其整体设计


8
我对我所找到的内容也不满意。现在你可以写成:
class Person {
public:
    Person() {}
    static SqlTable<Person>& table() {
        static SqlTable<Person> tab = SqlTable<Person>::sqlTable("Person",
            SqlColumn<Person>("Firstname",  makeAttr(&Person::firstname)),
            SqlColumn<Person>("Lastname",   makeAttr(&Person::lastname)),
            SqlColumn<Person>("Age",        makeAttr(&Person::age)),
        return tab;
    }
    std::string firstname;
    std::string lastname;
    int age;
};

SqliteDB db("testtable.db");
auto sel(db.select<Person>("Firstname=\"Danny\" and Lastname=\"Zeckzer\""));
std::for_each(sel.first, sel.second, [](const Person& p) {
...
Person me;
db.insert<Person>(me);
...
std::vector<Person> everybody;
db.insert<Person>(everybody.begin(), everybody.end());

只要使用sqlite3数据类型,表格方法就是您所需要编写的全部内容。作为模板,-O之后几乎没有抽象层代码。自然连接需要一个类似于Person类的结果类。该实现是单个头文件,不到500行。许可证为LGPL。 源代码

7

大家都给出了很好的建议:我告诉你一个不要使用的工具。

LiteSQL

我的经验非常糟糕。
我只是在研究要使用什么ORM,然后测试了很多。

弱点:

  • 没有文档
  • 没有解释性的README
  • 没有关于先决条件的说明
  • 由于许多错误而无法编译(这并不是真的,在v0.3.17中没有修复)

6
我也不满意我能找到的任何内容,所以我自己写了一个:sqlite3cc
以下是代码示例:
sqlite::connection db( filename );

sqlite::command c( db, "UPDATE foo SET bar = ? WHERE name = ?" );
c << 123 << name << sqlite::exec;

sqlite::query q( db, "SELECT foo FROM bar" );
for( sqlite::query::iterator i = q.begin(); i != q.end(); i++ )
    std::cout << i->column< std::string >( 0 ) << "\n";

它不再可供下载了吗? - NeDark
是的,它可用。只是还没有适当的发布。您可以从Bazaar存储库此处此处获取源代码(如果您没有它们,则需要从此处下载Bazaar RCS工具),或者您可以在线查看源代码此处 - edam

4

因为公司需求,所以我做了一个。 https://www.github.com/rubdos/libsqlitepp 它是使用C++11编写的,并且只包含头文件。只需将头文件放入您的项目中,包含它并链接到C sqlite库即可。

该git存储库中应该也有一些示例,使用起来相当简单。


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接