Je voudrais trouver un bon wrapper C++ orienté objet (par opposition à C) pour sqlite. Que recommandent les gens? Si vous avez plusieurs suggestions, veuillez les mettre dans des réponses séparées aux fins de vote. Veuillez également indiquer si vous avez une quelconque expérience du wrapper que vous proposez et comment vous l'avez trouvé à utiliser.
C'est vraiment une invitation aux votes vers le bas, 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.
Un autre bon emballage pour les bases de données en C++ est SOCI . Ce n'est pas très OO, mais le C++ plus moderne.
Il prend en charge Oracle, PostgreSQL et MySQL. A le backend SQLite est dans le CVS .
J'ai lu cet article et essayé certaines des bibliothèques mentionnées dans les réponses,
Mais aucun d'eux n'a été 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, string 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 !
En voici un qui n'a pas été mis à jour depuis un certain temps, mais qui se compile et s'exécute sur Mac OS GCC 4.3. Il est également publié sous la licence MIT, vous pouvez donc l'utiliser dans un projet commercial, aucun problème. 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();
Utilisez Qt - il a une excellente liaison pour SQLite qui s'intègre bien dans sa conception globale
Je n'étais pas non plus satisfait de ce que je pouvais trouver. Vous pouvez maintenant écrire:
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());
La méthode de table est tout ce dont vous avez besoin pour écrire tant que vous vous en tenez aux types de données sqlite3. Comme tout est un modèle, il ne reste pas beaucoup de code de couche d'abstraction 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. Source
Je n'étais pas satisfait de tout ce que je pouvais trouver, 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";
Tout le monde a donné de bons conseils sur ce qu'il faut utiliser: je vais vous dire quel instrument [~ # ~] pas [~ # ~] utiliser.
LiteSQL .
Mon expérience est terrible.
Je suis juste en train de faire des recherches sur ce que l'orm utilise, et j'en teste beaucoup.
Faiblesses:
http://www.codeproject.com/KB/database/CppSQLite.aspx est tout simplement fantastique, il est très facile à porter, je l'ai fait travailler sur bcb5 (omg) en une demi-heure environ . Il est à peu près aussi fin que possible et facile à comprendre. Il existe 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. Le seul problème délicat est de créer votre propre fichier lib, aucun n'est fourni.
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 .....
J'ai utilisé celui-ci http://www.codeproject.com/KB/database/CppSQLite.aspx mais je suis passé à C #, donc il peut y en avoir de nouveaux/meilleurs maintenant
J'en ai fait un à cause du besoin dans notre entreprise. https://www.github.com/rubdos/libsqlitepp Il s'agit de C++ 11 et de l'en-tête uniquement. Il suffit de mettre l'en-tête dans votre projet, de l'inclure et de créer un lien vers les bibliothèques C sqlite.
Les exemples devraient également se trouver quelque part sur ce dépôt git, assez faciles à utiliser.
Un autre simple est NLDatabase . Avertissement: je suis l'auteur. L'utilisation de base (et pour être honnête, vous n'obtiendrez pas beaucoup plus que "de base" de celui-ci) ressemble à ceci:
#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 plaisir, ouvrez une base de données, exécutez une requête et récupérez les résultats sur une seule ligne:
for ( auto & row : Database( "test.sqlite" ).query( "SELECT * FROM test").select() ) {
cout << row.column_string( 0 ) << endl;
}
Cette bibliothèque est géniale.
Il existe des versions Windows et Linux de la bibliothèque disponibles et j'étais opérationnel en quelques minutes.