私はsqlite用の優れたオブジェクト指向C++(Cではなく)ラッパーを見つけたいのですが。人々は何を勧めますか?複数の提案がある場合は、投票目的でそれらを別々の返信に入れてください。また、提案しているラッパーの経験があるかどうか、および使用する方法を教えてください。
これは本当に賛成票ですが、これは...
私はC++から直接sqliteを使用していますが、C++抽象化レイヤーを追加しても値が表示されません。現状ではかなり良好(かつ効率的)です。
C++のデータベースに適したもう1つのラッパーは [〜#〜] soci [〜#〜] です。それは非常にオブジェクト指向ではありませんが、よりモダンなC++です。
Oracle、PostgreSQL、MySQLをサポートしています。 SQLiteバックエンドはCVSにあります 。
私はこの投稿を読んで、回答で言及されているライブラリのいくつかを試しました、
しかし、どれも私にとって簡単なものではありませんでした(私は怠惰なプログラマです!)。
だから私は自分のラッパーを書いた: 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;
楽しんで !
これはしばらく更新されていないものですが、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();
Qtを使用します-全体的な設計によく適合するSQLiteに最適です。
また、私が見つけたものに満足していませんでした。今、あなたは書くことができます:
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です。 ソース
私も見つけることができて満足していなかったので、自分で書きました 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";
http://www.codeproject.com/KB/database/CppSQLite.aspx は素晴らしいです。移植するのは非常に簡単です。30分かそこらでbcb5(omg)で作業していました。薄くてわかりやすいです。知っておく必要のあるほぼすべてのことをカバーする、かなり多くの例があります。それはエラー処理に例外を使用します-私は数分で戻りコードを提供するようにそれを修正しました。トリッキーな問題は、提供されていない独自のlibファイルを作成することだけです。
try
{
CppSQLite3DB db;
db.open(asFileName.c_str());
db.execDML("Update data set hrx = 0");
} // try
catch (...)
{
} // catch
これよりはるかに単純なことはできません.....
私はこれを使用しました http://www.codeproject.com/KB/database/CppSQLite.aspx 私はC#に移動したので、新しい/より良いものがあるかもしれません
私たちの会社の必要性から私はそれを作りました。 https://www.github.com/rubdos/libsqlitepp C++ 11であり、ヘッダーのみです。ヘッダーをプロジェクトに入れてインクルードし、C sqliteライブラリにリンクするだけです。
例はそのgitリポジトリのどこかにあるはずで、かなり使いやすいでしょう。
別の簡単なものは 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;
}
}
そして、面白くするために、データベースを開いてクエリを実行し、結果をすべて1行で取得します。
for ( auto & row : Database( "test.sqlite" ).query( "SELECT * FROM test").select() ) {
cout << row.column_string( 0 ) << endl;
}