Qu’est-ce qu’un bon wrapper OO C ++ pour sqlite

J’aimerais trouver un bon wrapper C ++ (par opposition à C) orienté object pour sqlite. Que recommandent les gens? Si vous avez plusieurs suggestions, veuillez les inclure dans des réponses séparées à des fins de vote. Indiquez également si vous avez l’expérience du wrapper que vous proposez et comment vous l’avez trouvé.

Cela invite vraiment les votes négatifs, mais voilà …

J’utilise sqlite directement depuis C ++, et je ne vois aucune valeur avec une couche d’abstraction C ++ ajoutée. C’est assez bon (et efficace) tel quel.

SOCI est un autre outil utile pour les bases de données en C ++. Ce n’est pas très OO, mais le C ++ plus moderne.

Il supporte Oracle, PostgreSQL et MySQL. Un backend SQLite est dans le CVS .

En voici un qui n’a pas été mis à jour depuis longtemps, mais qui comstack et tourne sous Mac OS GCC 4.3. Il est également publié sous la licence MIT, vous pouvez donc l’utiliser dans un projet commercial, pas de problèmes. http://code.google.com/p/sqlite3pp/

L’utilisation est boostée et très propre:

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(); 

Voir: http://code.google.com/p/sqlite3pp/wiki/UsagePage

Utilisez Qt – il a une grande liaison pour SQLite qui s’intègre bien dans sa conception globale

J’ai lu ce post et essayé certaines des bibliothèques mentionnées dans les réponses,
Mais aucun d’entre eux n’était assez facile pour moi (je suis un programmeur paresseux!).

J’ai donc écrit mon propre wrapper: 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, ssortingng name, double weight) { cout < < age << ' ' << name << ' ' << weight << endl; }; // selects the count(*) of table user int count = 0; db << "select count(*) from user" >> count; 

S’amuser !

Je n’étais pas content non plus de ce que je pouvais trouver. Maintenant, vous pouvez écrire:

 class Person { public: Person() {} static SqlTable& table() { static SqlTable tab = SqlTable::sqlTable("Person", SqlColumn("Firstname", makeAttr(&Reservation::firstname)), SqlColumn("Lastname", makeAttr(&Reservation::lastname)), SqlColumn("Age", makeAttr(&Reservation::age)), return tab; } std::ssortingng firstname; std::ssortingng lastname; int age; }; SqliteDB db("testtable.db"); auto sel(db.select("Firstname=\"Danny\" and Lastname=\"Zeckzer\"")); std::for_each(sel.first, sel.second, [](const Person& p) { ... Person me; db.insert(me); ... std::vector everybody; db.insert(everybody.begin(), everybody.end()); 

La méthode de la table est tout ce que vous devez écrire tant que vous vous en tenez aux types de données sqlite3. Comme tout est un modèle, peu de code de couche d’abstraction rest après -O. Les jointures naturelles nécessitent une classe de résultats similaire à la classe Person. L’implémentation est un en-tête unique avec moins de 500 lignes. La licence est LGPL. La source

Je n’étais pas content de tout ce que je pouvais trouver non plus, alors j’ai écrit le mien: sqlite3cc .

Voici un exemple de code:

 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"; 

http://www.codeproject.com/KB/database/CppSQLite.aspx est tout simplement fantastique, il est très facile à transférer, je l’ai fait fonctionner sur bcb5 (omg) en une demi-heure environ. Il est à peu près aussi fin que possible et facile à comprendre. Il y a un bon nombre d’exemples qui couvrent à peu près tout ce que vous devez savoir. Il utilise des exceptions pour la gestion des erreurs – je l’ai modifié pour fournir des codes de retour en quelques minutes. La seule difficulté consiste à créer votre propre fichier lib.

 try { CppSQLite3DB db; db.open(asFileName.c_str()); db.execDML("Update data set hrx = 0"); } // try catch (...) { } // catch 

Ne pourrait pas être beaucoup plus simple que cela …..

Tout le monde a donné de bons conseils sur ce qu’il faut utiliser: je vais vous dire quel instrument ne pas utiliser.

LiteSQL .

Mon expérience est terrible.
Je ne fais que des recherches sur l’utilisation d’orm et j’en teste beaucoup.

Faiblesses:

  • pas de documentation
  • pas de README explicatif
  • aucune explication sur les prérequirejs
  • ne comstack pas à cause de bugs (n’est pas vrai, n’est pas corrigé dans la v0.3.17)

J’ai utilisé celui-ci http://www.codeproject.com/KB/database/CppSQLite.aspx mais je suis passé à C #, il peut donc y en avoir de plus récents / meilleurs

Peut-être que vous pouvez regarder

http://pocoproject.org

ou

Platinum C ++ Framework

Un autre exemple simple est NLDatabase . Disclaimer: je suis l’auteur. Utilisation de base (et pour être honnête, vous n’obtiendrez pas grand chose de plus que “basique”):

 #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; } } 

Et juste pour le fun, ouvrez une firebase database, exécutez une requête et récupérez les résultats en une seule ligne:

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

J’en ai fabriqué un à cause du besoin dans notre entreprise. https://www.github.com/rubdos/libsqlitepp C ++ 11 et en-tête uniquement. Il suffit de mettre l’en-tête dans votre projet, de l’inclure et de le lier aux bibliothèques C sqlite.

Les exemples devraient être quelque part sur ce repo git, assez facile à utiliser.

Bibliothèque de modèles Oracle / OCI / ODBC

Cette bibliothèque est géniale.

http://www.sqlapi.com/

Des versions Windows et Linux de la bibliothèque sont disponibles et j’étais opérationnel en quelques minutes.

L’avez-vous porté avec succès pour mingw-3.4.5? Voulez-vous partager la version scope?

THX.

http://www.codeproject.com/KB/database/CppSQLite.aspx est tout simplement fantastique, il est très facile à transférer, je l’ai fait fonctionner sur bcb5 (omg) en une demi-heure environ. Il est à peu près aussi fin que possible et facile à comprendre. Il y a un bon nombre d’exemples qui couvrent à peu près tout ce que vous devez savoir. Il utilise des exceptions pour la gestion des erreurs – je l’ai modifié pour fournir des codes de retour en quelques minutes. La seule difficulté consiste à créer votre propre fichier lib.