web-dev-qa-db-ja.com

良いものは何ですかOO sqliteのC ++ラッパー

私はsqlite用の優れたオブジェクト指向C++(Cではなく)ラッパーを見つけたいのですが。人々は何を勧めますか?複数の提案がある場合は、投票目的でそれらを別々の返信に入れてください。また、提案しているラッパーの経験があるかどうか、および使用する方法を教えてください。

57
Foo42

これは本当に賛成票ですが、これは...

私はC++から直接sqliteを使用していますが、C++抽象化レイヤーを追加しても値が表示されません。現状ではかなり良好(かつ効率的)です。

47
Johan Kotlinski

C++のデータベースに適したもう1つのラッパーは [〜#〜] soci [〜#〜] です。それは非常にオブジェクト指向ではありませんが、よりモダンなC++です。

Oracle、PostgreSQL、MySQLをサポートしています。 SQLiteバックエンドはCVSにあります

18
jk.

私はこの投稿を読んで、回答で言及されているライブラリのいくつかを試しました、
しかし、どれも私にとって簡単なものではありませんでした(私は怠惰なプログラマです!)。

だから私は自分のラッパーを書いた: 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;

楽しんで !

15
amin

これはしばらく更新されていないものですが、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();

参照: http://code.google.com/p/sqlite3pp/wiki/UsagePage

12
markshiz

Qtを使用します-全体的な設計によく適合するSQLiteに最適です。

11
zaharpopov

また、私が見つけたものに満足していませんでした。今、あなたは書くことができます:

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です。 ソース

7
burner

私も見つけることができて満足していなかったので、自分で書きました 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";
5
edam

誰もが何を使うべきかについて良いアドバイスをしてくれました:私はあなたにどの楽器[〜#〜] [〜#〜]を使わないかを教えます。

LiteSQL

私の経験はひどいです。
私はormが何を使用しているかについて再調査しているだけであり、私はそれの多くをテストしています。

弱点:

  • ドキュメントなし
  • 説明的なREADMEはありません
  • 前提条件に関する説明なし
  • bug が多いためコンパイルしないでください(正しくありません、v0.3.17では修正されていません)
4
Luca Davanzo

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

これよりはるかに単純なことはできません.....

4
David Cameron

私はこれを使用しました http://www.codeproject.com/KB/database/CppSQLite.aspx 私はC#に移動したので、新しい/より良いものがあるかもしれません

4
Brad Bruce

私たちの会社の必要性から私はそれを作りました。 https://www.github.com/rubdos/libsqlitepp C++ 11であり、ヘッダーのみです。ヘッダーをプロジェクトに入れてインクルードし、C sqliteライブラリにリンクするだけです。

例はそのgitリポジトリのどこかにあるはずで、かなり使いやすいでしょう。

3
rubdos

おそらくあなたは見てみることができます

http://pocoproject.org

または

プラチナC++フレームワーク

3
SebastianK

別の簡単なものは 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;
}
3
Tomas Andrle
2
Chris K

このライブラリは素晴らしいです。

http://www.sqlapi.com/

利用可能なライブラリのWindowsおよびLinuxバージョンがあり、数分で起動して実行しました。

0
Rob