Что такое хорошая оболочка OO C++ для sqlite?

Я хотел бы найти хорошую объектно-ориентированную оболочку C++ (в отличие от C) для sqlite. Что люди рекомендуют? Если у вас есть несколько предложений, пожалуйста, внесите их в отдельные ответы для голосования. Также, пожалуйста, укажите, есть ли у вас какой-либо опыт использования предлагаемой обертки и как вы ее нашли.

16 ответов

Это действительно приглашает отрицательных голосов, но здесь идет...

Я использую sqlite непосредственно из C++ и не вижу никакого значения с добавленным уровнем абстракции C++. Это довольно хорошо (и эффективно), как есть.

Еще одна хорошая обертка для баз данных в C++ - SOCI. Это не очень хорошо, но более современный C++.

Он поддерживает Oracle, PostgreSQL и MySQL. Бэкэнд SQLite находится в CVS.

Я прочитал этот пост и попробовал некоторые библиотеки, упомянутые в ответах,
Но ни один из них не был достаточно легок для меня (я ленивый программист!).

Поэтому я написал свою собственную оболочку: 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;

Повеселись!

Вот тот, который не обновлялся некоторое время, но компилируется и работает на 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

Используйте Qt - он имеет отличную привязку для SQLite, которая хорошо вписывается в его общий дизайн

Я также не был доволен тем, что я мог найти. Теперь вы можете написать:

class Person {
public:
    Person() {}
    static SqlTable<Person>& table() {
        static SqlTable<Person> tab = SqlTable<Person>::sqlTable("Person",
            SqlColumn<Person>("Firstname",  makeAttr(&Reservation::firstname)),
            SqlColumn<Person>("Lastname",   makeAttr(&Reservation::lastname)),
            SqlColumn<Person>("Age",        makeAttr(&Reservation::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. Источник

Все дали хороший совет о том, что использовать: я скажу вам, какой инструмент НЕ использовать.

LiteSQL.

Мой опыт ужасен.
Я просто делаю некоторые исследования по использованию orm, и я тестирую многое из этого.

Недостатки:

  • нет документации
  • нет объяснения README
  • нет объяснения предпосылок
  • не компилировать из-за большого количества ошибок (не соответствует действительности, не исправлено в v0.3.17)

Я не был доволен тем, что мог найти, поэтому я написал свой собственный: 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";

Еще один простой - NLDatabase. Отказ от ответственности: я автор. Базовое использование (и, честно говоря, вы не получите намного больше, чем "основное" от этого) выглядит так:

#include "NLDatabase.h"


using namespace std;
using namespace NL::DB;


int main(int argc, const char * argv[]) {

    Database db( "test.sqlite" );

    auto results = db.query("SELECT * FROM test WHERE name <> ?").select("TOM");

    for ( auto const & row : results ) {
        cout << "column[0]=" << row.column_string( 0 ) << endl;
    }
}

И просто для удовольствия, откройте базу данных, выполните запрос и получите результаты в одну строку:

for ( auto & row : Database( "test.sqlite" ).query( "SELECT * FROM test").select() ) {
    cout << row.column_string( 0 ) << endl;
}

http://www.codeproject.com/KB/database/CppSQLite.aspx просто фантастика, портировать его очень легко, у меня он работал на bcb5 (omg) через полчаса или около того. Он настолько тонок, насколько вы можете его получить, и его легко понять. Существует множество примеров, которые охватывают практически все, что вам нужно знать. Он использует исключения для обработки ошибок - я изменил его, чтобы обеспечить коды возврата в считанные минуты. Единственная сложная задача - создать свой собственный файл lib.

try
{

    CppSQLite3DB db;

    db.open(asFileName.c_str());

    db.execDML("Update data set hrx = 0");

} // try

catch (...)
{

} // catch

Не может быть намного проще, чем это.....

Я использовал этот http://www.codeproject.com/KB/database/CppSQLite.aspx но я перешел на C#, так что теперь могут быть более новые / лучшие

Я сделал один из-за необходимости в нашей компании. https://www.github.com/rubdos/libsqlitepp Это C++11 и только заголовок. Просто поместите заголовок в ваш проект, включите его и создайте ссылку на библиотеки C sqlite.

Примеры должны быть где-то в этом git-репо, довольно просты в использовании.

Возможно, вы можете взглянуть на

http://pocoproject.org/

или же

Платиновый C++ Framework

Эта библиотека великолепна.

http://www.sqlapi.com/

Доступны версии библиотеки для Windows и Linux, и я был запущен за несколько минут.

Вы успешно портировали его для mingw-3.4.5? Вы поделитесь портированной версией?

Спасибо.

http://www.codeproject.com/KB/database/CppSQLite.aspx просто фантастика, портировать его очень легко, у меня он работал на bcb5 (omg) через полчаса или около того. Он настолько тонок, насколько вы можете его получить, и его легко понять. Существует множество примеров, которые охватывают практически все, что вам нужно знать. Он использует исключения для обработки ошибок - я изменил его, чтобы обеспечить коды возврата в считанные минуты. Единственная сложная задача - создать свой собственный файл lib.

Другие вопросы по тегам