1. 程式人生 > >ODB——基於c++的ORM映射框架嘗試(使用)

ODB——基於c++的ORM映射框架嘗試(使用)

連接數據庫 代碼 pen c++代碼 /tmp acc void count() lan

摘要: 2、使用 首先,需要定義一個對象,用來和數據庫字段對應: [cce lang=”cpp”] #ifndef VOLUME_H #define VOLUME_H #include #include #pragma db object cl

2、使用
首先,需要定義一個對象,用來和數據庫字段對應:
[cce lang=”cpp”]
#ifndef VOLUME_H
#define VOLUME_H

#include <string>
#include <odb/core.hxx>

#pragma db object
class Volume

{
public:
Volume(const std::string &name, const std::string &location, const std::string &cover_path, int trackCount)
: _name(name), _location(location), _cover_path(cover_path), _trackerCount(trackCount)
{}

unsigned long long id() { return _id; }
void id(unsigned long long i) { _id = i;}

const std::string &name() {return _name;}

void name(const std::string &n) {_name = n;}

const std::string &location() {return _location;}
void location(const std::string &l) {_location = l;}

const std::string &cover_path() {return _cover_path;}
void cover_path(const std::string &c) {_cover_path = c;}

int trackCount() {return _trackerCount;}

void trackCount(int c) {_trackerCount = c;}

private:
friend class odb::access;
Volume () {}

#pragma db id auto
unsigned long long _id;
std::string _name;
std::string _location;
std::string _cover_path;
int _trackerCount;
};
[/cce]
首先是引入core.hxx這個頭文件,包含access這個類。在類上面添加#pragma db object宏,標識這是個數據庫對象。在主鍵上增加宏#pragma db id auto,標識這個是主鍵,並且自增。這兩個宏都是提供信息給odb,用來生成最終c++代碼的。因為數據庫對應字段都是私有類型,所以需要將odb::access聲明為友元。

為了方便,這裏連接數據庫都使用sqlite,因此,需要引入sqlite相關的包。創建數據庫連接(對sqlite來說,就是打開數據庫文件):
[cce lang=”cpp”]
std::shared_ptr<odb::database> sqliteDB(new odb::sqlite::database("mycppweb.db", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE));
[/cce]
註:這裏需要引入頭文件odb/sqlite/database.hxx,創建數據庫連接的第一個參數(只針對sqlite)是數據庫文件名,後面是打開的flag,這裏主要是提示如果數據庫文件不存在,默認創建。另外,這裏使用了c++11的shared_ptr,g++需要添加參數-std=c++0x

插入對象:
[cce lang=”cpp”]
{
odb::transaction t(db->begin());
volumeId = db->persist(volume);
t.commit();
}
[/cce]
插入的時候,使用了事務,需要引入odb/transaction.hxx頭文件,並且盡量減少transaction的生命周期。

通過odb命令生成對應的代碼:
[cce lang=”bash”]
odb –database sqlite \
–hxx-suffix .hpp –ixx-suffix .ipp –cxx-suffix .cpp \
–output-dir /tmp \
–generate-query –generate-schema –schema-format embedded volume.h
[/cce]
這裏指定輸出的數據庫是sqlite,創建schema的語句嵌入到代碼裏面。
執行之後,會生成volume-odb.hpp、volume-odb.cpp和volume-odb.ipp三個文件。查看volume-odb.cpp就會發現,裏面包含了volume.h中指定的類和數據庫表的關系。如果希望通過代碼來創建數據庫(貌似需要自己來判斷是否已經存在,否則第二次運行又會重新創建表,導致數據丟失),可以通過:
[cce lang=”cpp”]
{
odb::transaction t (sqliteDB->begin ());
odb::schema_catalog::create_schema (*sqliteDB);
t.commit ();
}
[/cce]

odb的查詢,還沒有去嘗試,具體文檔在http://www.codesynthesis.com/products/odb/doc/manual.xhtml

ODB——基於c++的ORM映射框架嘗試(使用)