Я бы хотел найти хорошую объектно-ориентированную С++ (в отличие от C) оболочку для sqlite. Что рекомендуют люди? Если у вас есть несколько предложений, пожалуйста, разместите их в отдельных ответах для голосования. Кроме того, укажите, есть ли у вас опыт обертки, которую вы предлагаете, и как вы ее нашли.
Что такое хорошая OO С++-оболочка для sqlite
Ответ 1
Это действительно приглашает пустые голоса, но здесь идет...
Я использую sqlite непосредственно из С++ и не вижу никакого значения с добавленным уровнем абстракции С++. Это неплохо (и эффективно), как есть.
Ответ 2
Еще один хороший wraper для баз данных на С++ - SOCI. Это не очень OO, но более современный С++.
Он поддерживает Oracle, PostgreSQL и MySQL. A Бэкэнд SQLite находится в CVS.
Ответ 3
Здесь тот, который не обновлялся некоторое время, но компилируется и запускается на 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();
Ответ 4
Использовать Qt - он отлично подходит для SQLite, который хорошо вписывается в его общий дизайн
Ответ 5
Мне также не понравилось то, что я мог найти. Теперь вы можете написать:
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;
Удачи!
Ответ 7
Я не был доволен тем, что мог найти, поэтому я написал свой собственный: 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";
Ответ 8
Я использовал этот http://www.codeproject.com/KB/database/CppSQLite.aspx, но я перешел на С#, поэтому теперь могут быть более новые/лучшие
Ответ 9
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
Не может быть намного проще, чем это.....
Ответ 10
Каждый дал хороший совет относительно того, что использовать: я расскажу вам, какой инструмент НЕ.
Мой опыт ужасен.
Я просто делаю некоторые исследования того, что использует orm, и я тестирую его много.
Слабые стороны:
- нет документации
- без пояснения README
- нет объяснений по предпосылкам
- не компилируются из-за большого количества bug (это неверно, не исправлено в v0.3.17)
Ответ 11
Возможно, вы можете взглянуть на
или
Ответ 12
Другим простым является 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;
}
Ответ 13
Я сделал один из-за необходимости в нашей компании. https://www.github.com/rubdos/libsqlitepp Это С++ 11 и только заголовок. Просто поместите заголовок в свой проект, включите его и свяжите с библиотеками C sqlite.
Примеры должны быть где-то в этом репозитории git, достаточно просты в использовании.
Ответ 14
Ответ 15
Эта библиотека блестящая.
Доступны версии библиотеки Windows и Linux, и я работал в течение нескольких минут.
Ответ 16
Вы успешно портировали его для mingw-3.4.5? Вы поделитесь с портированной версией?
спасибо.
http://www.codeproject.com/KB/database/CppSQLite.aspx просто фантастичен, его очень легко переносить, я работал над bcb5 (omg) через полчаса или так. Он примерно такой же тонкий, как вы можете получить и легко понять. Есть много примеров, которые охватывают практически все, что вам нужно знать. Он использует исключения для обработки ошибок - я изменил его, чтобы обеспечить коды возврата в течение нескольких минут. Только сложная проблема заключается в создании собственного файла lib, который не предоставляется.