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

50

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

Теги:
database

16 ответов

45

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

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

  • 7
    Ну, вы получили только -4 за два отрицательных голоса, и я проголосовал против вас. Использование интерфейса C, безусловно, является вариантом и, вероятно, будет тем, который мы выберем. Конечно, мы можем использовать несколько легких оболочек C ++, возможно, boost :: shared_ptr с пользовательскими удалителями и, возможно, исключение для обработки ошибок, но в действительности нет необходимости в огромном API.
  • 0
    @CashCow: Да - спасибо - я сделал то же самое.
Показать ещё 1 комментарий
16

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

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

12

Здесь тот, который не обновлялся некоторое время, но компилируется и запускается на 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, который хорошо вписывается в его общий дизайн

7

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

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. Источник

6

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

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

Удачи!

5

Я не был доволен тем, что мог найти, поэтому я написал свой собственный: 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";
  • 0
    Это больше не доступно для скачивания?
  • 0
    Да, это доступно. Там просто не было правильных релизов еще. Вы можете получить исходный код из репозитория Bazaar здесь или здесь (вам нужно скачать отсюда инструменты RCS Bazaar, если у вас их нет), или вы можете просмотреть исходный код здесь
4

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

LiteSQL.

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

Слабые стороны:

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

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

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

4

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

3

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

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

3

Другим простым является 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;
}
3

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

http://pocoproject.org

или

Платиновая С++ Framework

1
0

Эта библиотека блестящая.

http://www.sqlapi.com/

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

  • 16
    Мне интересно, что в этом такого блестящего?
  • 8
    Обратите внимание, что библиотека является условно-бесплатной. Я понял это, когда изменил весь мой источник ...
Показать ещё 1 комментарий
-1

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

спасибо.

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

Сообщество Overcoder
Наверх
Меню