2008-09-23 34 views
52

Me gustaría encontrar un buen contenedor C++ orientado a objetos (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.Qué es un buen contenedor OO C++ para sqlite

+1

También revise la lista en: http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers – User

Respuesta

0

Esta biblioteca es brillante.

http://www.sqlapi.com/

Hay versiones para Windows y Linux de la biblioteca disponible y yo estaba en funcionamiento en cuestión de minutos.

+16

Soy cur ¿Qué tiene de brillante? –

+8

Observe que la biblioteca es shareware. Me di cuenta de eso cuando cambié todo mi código fuente ... – NeDark

+19

El sitio dice "Si está navegando una copia local de SQLAPI ++ Web, visite la página oficial de pedidos en www.sqlapi.com \ Ordene verificar que los precios hayan subido -hasta la fecha." Sinceramente, me incomoda pagar una biblioteca de códigos de un desarrollador que no sabe que la barra invertida no pertenece a un URI. ;) –

16

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. A SQLite backend is in the CVS.

4

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 pudo ser mucho más simple que esto .....

-1

¿Se han portado con éxito para MinGW-3.4.5? ¿Compartirás la versión portada?

Thx.

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.

11

uso de Qt - que tiene un gran vinculante para SQLite que encaja muy bien en su diseño general

5

No estaba contento con ninguno que pudiera encontrar tampoco, así que escribí el mío: sqlite3cc.

Aquí está 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"; 
+0

¿Ya no está disponible para su descarga? – NeDark

+0

Sí, está disponible. Simplemente no ha habido lanzamientos adecuados todavía. Puede obtener el código fuente del repositorio bazar [aquí] (http://www.waxworlds.org/edam/software/sqlite3cc#repository) o [aquí] (https://code.launchpad.net/sqlite3cc) (tendrás que descargar las herramientas de Bazar RCS desde [aquí] (http://bazaar.canonical.com/) si no las tienes) o puedes ver el código fuente en línea [aquí] (http: //bazaar.launchpad.net/~edam/sqlite3cc/trunk/files) – edam

44

Esto es muy atractivo abajo-votos, pero aquí va ...

Uso sqlite directamente desde C++, y no veo ningún valor con una capa de abstracción añadida de C++. Es bastante bueno (y eficiente) como es.

+7

Bueno, solo obtuviste -4 para los dos votos a favor y yo te voté a favor. El uso de la interfaz C ciertamente es una opción y es probable que sea la que elijamos. Por supuesto, podemos usar algunas envolturas ligeras de C++, posiblemente boost :: shared_ptr con modificadores personalizados, y posiblemente una excepción para manejar errores, pero no una necesidad real de una gran API. – CashCow

+0

@CashCow: Sí, gracias, hice lo mismo. –

+1

Del mismo modo, al final, esta fue la alternativa más sensata que tuvimos también. – WhozCraig

12

Aquí hay uno que no se ha actualizado por un 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 impulso ified 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(); 

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

7

también que no estaba contento con lo que he podido encontrar. Ahora se puede 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 la tabla es todo lo que necesita para escribir, siempre y cuando usted se pega 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

3

Otro simple es NLDatabase. Descargo de responsabilidad: soy el autor. El uso básico (y para ser honesto, usted no obtiene mucho más que "básica" de éste) tiene el siguiente aspecto:

#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 sólo por diversión, abrir una base de datos, ejecutar una consulta y buscar los resultados de todos en una línea:

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

he leído este post y trataron algunas de las bibliotecas mencionadas en las respuestas,
Pero ninguno de ellos era lo suficientemente fácil para mí (soy un programador perezoso!).

así que escribí mi propio envoltorio: 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 se diviertan!

3

Hice uno debido a la necesidad en nuestra empresa. https://www.github.com/rubdos/libsqlitepp Es C++ 11 y encabezado solamente. Simplemente coloque el encabezado en su proyecto, inclúyalo y enlace a las bibliotecas C sqlite.

Los ejemplos deben estar en algún lugar en ese git repo también, bastante fácil de usar.

4

Todo el mundo han dado buenos consejos sobre lo que debe utilizar: te voy a decir qué instrumento NO uso.

LiteSQL.

Mi experiencia es terrible.
Estoy haciendo algunas investigaciones sobre el uso de orms, y estoy probando mucho.

Debilidades:

  • ninguna documentación
  • sin README explicativa
  • ninguna explicación sobre los requisitos previos
  • no elaboren, debido a una gran cantidad de bug (no es cierto, no es fijo, v0.3.17)