ODB——基于c++的ORM映射框架尝试(使用)

简介: 2、使用 首先,需要定义一个对象,用来和数据库字段对应: [cce lang=”cpp”] #ifndef VOLUME_H #define VOLUME_H #include <string> #include <odb/core.hxx> #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


转载自:https://coolex.info/blog/376.html

目录
相关文章
|
1月前
|
设计模式 编解码 程序员
探索 C++ 20 (co_await、co_yield 和 co_return)协程基本框架的使用
探索 C++ 20 (co_await、co_yield 和 co_return)协程基本框架的使用
77 1
探索 C++ 20 (co_await、co_yield 和 co_return)协程基本框架的使用
|
1月前
|
缓存 编译器 Linux
gcc 将C/C++ 热函数映射到大页的方法
gcc 将C/C++ 热函数映射到大页的方法
20 1
|
5月前
|
IDE 开发工具 C++
⚡【C++要笑着学】(40) OF框架:OpenFrameworks 框架介绍 | oF 文件结构 | 图形基础 | 使用 ProjectGenerator 创建项目
⚡【C++要笑着学】(40) OF框架:OpenFrameworks 框架介绍 | oF 文件结构 | 图形基础 | 使用 ProjectGenerator 创建项目
55 0
|
2月前
|
存储 算法 C++
C++ STL精通之旅:向量、集合与映射等容器详解
C++ STL精通之旅:向量、集合与映射等容器详解
102 0
|
7月前
|
存储 Java C++
3.【C++map映射】
3.【C++map映射】
72 0
|
4月前
|
SQL 数据库 C++
C++ Qt开发:SqlTableModel映射组件应用
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍`SqlTableModule`组件的常用方法及灵活运用。 在多数情况下我们需要使用SQL的方法来维护数据库,但此方式相对较为繁琐对于表格等数据的编辑非常不友好,在`Qt`中提供了`QSqlTableModel`模型类,它为开发者提供了一种直观的方式来与数据库表格进行交互。通过使用该组件可以将数据库与特定的组件进行关联,一旦关联被建立那么用户的所有操作均可以使用函数的方式而无需使用`SQL`语句,该特性有点类
28 1
|
4月前
|
C++ 索引
C++ Qt开发:StringListModel字符串列表映射组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍`QStringListModel`字符串映射组件的常用方法及灵活运用。 `QStringListModel` 是 Qt 中用于处理字符串列表数据的模型类之一,它是 `QAbstractListModel` 的子类,用于在 Qt 的视图类(如 `QListView`、`QComboBox` 等)中显示字符串列表。该组件是用于在`Qt`中快速显示字符串列表的便捷模型类。该组件通常会配合`ListView`一起使
35 0
C++ Qt开发:StringListModel字符串列表映射组件
|
5月前
|
算法 Linux 定位技术
C++游戏后端开发,基于魔兽开源后端框架TrinityCore
C++游戏后端开发,基于魔兽开源后端框架TrinityCore
|
8月前
|
存储 C++ 容器
6.1 C++ STL 序列映射容器
Map/Multimap 映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用`Multimap`声明映射容器,则同样可以插入相同的键值。
62 0
|
9月前
|
IDE Linux 开发工具
C++之openFrameworks框架
openFrameworks(简称 oF)是一个基于C++的开源库。 它提供了丰富的功能库和工具,用于快速开发多媒体、交互性和艺术创作相关的应用程序,如艺术装置、互动艺术、音视频作品、实时图形等。oF 的设计目标是让创意编程变得更加简单、直观和灵活,使艺术家、设计师、创意工作者等能够利用编程进行创作和表达。oF提供了丰富的图形、音频、输入输出、计算机视觉等功能库,并支持跨平台开发,适用于Windows、Mac OSX、Linux等操作系统。oF的社区活跃,有大量的用户和开发者共享和贡献了各种扩展、插件和示例代码。
88 0