tutorial - Qué es un buen contenedor OO C++ para sqlite
sqlite3 c++ (16)
Me gustaría encontrar un buen contenedor orientado a objetos C ++ (en lugar de C) para sqlite. ¿Qué recomienda la gente? Si tiene varias sugerencias, póngalas en respuestas separadas para fines de votación. Además, indique si tiene alguna experiencia con el contenedor que está sugiriendo y cómo lo encontró para usar.
¿Lo ha portado con éxito para mingw-3.4.5? ¿Compartirás la versión portada?
Gracias.
http://www.codeproject.com/KB/database/CppSQLite.aspx es simplemente fantástico, es muy fácil de portar, lo tuve trabajando en bcb5 (omg) en media hora más o menos. Es lo más delgado posible y fácil de entender. Hay una buena cantidad de ejemplos que cubren casi todo lo que necesita saber. Utiliza excepciones para el manejo de errores. Lo modifiqué para proporcionar códigos de retorno en minutos. El único problema complicado es crear su propio archivo lib. Ninguno se proporciona.
Aquí hay uno que no se ha actualizado desde hace tiempo, pero se compila y se ejecuta en Mac OS GCC 4.3. También se lanzó bajo la licencia MIT, por lo que puede usarlo en un proyecto comercial, sin problemas. http://code.google.com/p/sqlite3pp/
El uso es impulsado y muy limpio:
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();
Esta biblioteca es brillante.
Hay versiones de Windows y Linux de la biblioteca disponibles y estuve en funcionamiento en minutos.
Esto es realmente atractivo para los votos negativos, pero aquí va ...
Uso sqlite directamente desde C ++, y no veo ningún valor con una capa de abstracción de C ++ añadida. Es bastante bueno (y eficiente) como es.
He usado este http://www.codeproject.com/KB/database/CppSQLite.aspx pero me he movido a C #, por lo que puede haber nuevos / mejores ahora
Hice uno debido a la necesidad en nuestra compañía. https://www.github.com/rubdos/libsqlitepp Es C ++ 11 y solo encabezado. Simplemente coloque el encabezado en su proyecto, inclúyalo y enlace a las bibliotecas C sqlite.
Los ejemplos deberían estar en algún lugar en ese git repo, bastante fácil de usar.
Leí esta publicación y probé algunas de las bibliotecas mencionadas en las respuestas,
Pero ninguno de ellos fue lo suficientemente fácil para mí (¡soy un programador perezoso!).
Así que escribí mi propia envoltura: 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;
Que te diviertas !
No estaba satisfecho con ninguno que pudiera encontrar, así que escribí el mío: sqlite3cc .
Aquí hay un ejemplo de código:
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";
Otro buen wraper para bases de datos en C ++ es SOCI . No es muy OO, pero el C ++ es más moderno.
Es compatible con Oracle, PostgreSQL y MySQL. Un back-end SQLite está en el CVS .
Otro sencillo es NLDatabase . Descargo de responsabilidad: soy el autor. El uso básico (y para ser honesto, no obtendrá mucho más que "básico" de este) se ve así:
#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;
}
}
Y solo por diversión, abra una base de datos, ejecute una consulta y obtenga resultados, todo en una sola línea:
for ( auto & row : Database( "test.sqlite" ).query( "SELECT * FROM test").select() ) {
cout << row.column_string( 0 ) << endl;
}
Tampoco estaba contento con lo que pude encontrar. Ahora puedes escribir:
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());
El método de tabla es todo lo que necesita para escribir, siempre y cuando se adhiera a los tipos de datos sqlite3. Como todo es una plantilla, no queda mucho código de capa de abstracción después de -O. Las uniones naturales requieren una clase de resultado similar a la clase Persona. La implementación es un encabezado único con menos de 500 líneas. La licencia es LGPL. Source
Todos han dado buenos consejos sobre qué usar: te diré qué instrumento NO usas.
LiteSQL .
Mi experiencia es terrible.
Solo estoy haciendo una investigación sobre el uso de orm, y estoy probando mucho.
Debilidades:
- sin documentación
- no hay README explicativo
- ninguna explicación sobre los requisitos previos
- no se compila debido a una gran cantidad de bug (no es cierto, no se corrige en v0.3.17)
Use Qt: tiene un excelente enlace para SQLite que se adapta bien a su diseño general
http://www.codeproject.com/KB/database/CppSQLite.aspx es simplemente fantástico, es muy fácil de portar, lo tuve trabajando en bcb5 (omg) en media hora más o menos. Es lo más delgado posible y fácil de entender. Hay una buena cantidad de ejemplos que cubren casi todo lo que necesita saber. Utiliza excepciones para el manejo de errores. Lo modifiqué para proporcionar códigos de retorno en minutos. El único problema complicado es crear su propio archivo lib. Ninguno se proporciona.
try
{
CppSQLite3DB db;
db.open(asFileName.c_str());
db.execDML("Update data set hrx = 0");
} // try
catch (...)
{
} // catch
No podría ser mucho más simple que esto .....