本文不是 odb 的教程,只是介绍如何在 WSL2 下使用 cmake 搭建 odb 应用的编译环境。
ODB 是 c++ 的对象持久化工具,底层支持的数据库包括 mysql/pgsql/sqlite/sqserver/oracle。更多关于 odb 的信息可以参考官网手册。
我的开发环境是 WSL2 + vscode。
安装所需依赖:
sudo apt-get install odb
sudo apt-get install libmysqlclient-dev # 我使用 mysql,需要安装 Mysql 开发库
g++7.5 不支持 odb2.4,需要回退到 g++7.3
sudo apt-get install gcc-7-base=7.3.0-16ubuntu3 cpp-7=7.3.0-16ubuntu3 gcc-7=7.3.0-16ubuntu3 libgcc-7-dev=7.3.0-16ubuntu3 libasan4=7.3.0-16ubuntu3 libubsan0=7.3.0-16ubuntu3 libcilkrts5=7.3.0-16ubuntu3
sudo apt-get install g++-7=7.3.0-16ubuntu3 libstdc++-7-dev=7.3.0-16ubuntu3
sudo ln -s /usr/bin/g++-7 /usr/bin/g++
sudo ln -s /usr/bin/gcc-7 /usr/bin/gcc
sudo ln -s /usr/bin/gcc /usr/bin/cc
models 目录下存放我们定义的源文件。
models/person.hpp:
#ifndef __PERSION_HPP__
#define __PERSION_HPP__
#include <string>
#include <odb/core.hxx>
#pragma db object
class person
{
public:
person (const std::string& first,
const std::string& last,
unsigned short age);
const std::string& first () const;
const std::string& last () const;
unsigned short age () const;
void age (unsigned short);
private:
person() {};
friend class odb::access;
#pragma db id auto
unsigned long id_;
std::string first_;
std::string second_;
unsigned short age_;
};
#endif
models/person.cpp
#include "person.hpp"
person::person(const std::string& first,
const std::string& last,
unsigned short age) : first_(first), second_(last), age_(age) {};
const std::string& person::first() const {
return first_;
}
const std::string& person::last() const {
return second_;
}
unsigned short person::age() const {
return age_;
}
void person::age(unsigned short a) {
age_ = a;
}
generated 目录是存放我们使用 odb 生成查询代码的目录。
main.cpp
#include <iostream>
#include <memory>
#include <odb/database.hxx>
#include <odb/transaction.hxx>
#include <odb/mysql/database.hxx>
#include "person.hpp"
#include "person-odb.hxx"
using namespace std;
using namespace odb::core;
int main(int argc, char *argv[])
{
try
{
auto_ptr<database> db (new odb::mysql::database ("root", "root", "test", "127.0.0.1", 3306, "", "utf8"));
unsigned long john_id, jane_id, joe_id;
// Create a few persistent person objects.
//
{
person john ("John", "Doe", 33);
person jane ("Jane", "Doe", 32);
person joe ("Joe", "Dirt", 30);
transaction t (db->begin ());
// Make objects persistent and save their ids for later use.
//
john_id = db->persist (john);
jane_id = db->persist (jane);
joe_id = db->persist (joe);
t.commit ();
}
}
catch (const odb::exception& e)
{
cerr << e.what () << endl;
return 1;
}
return 0;
}
CMakeList.txt
cmake_minimum_required(VERSION 3.0.0)
project(mtest VERSION 0.1.0)
INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}/models/
${CMAKE_SOURCE_DIR}/generated/)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")
MACRO(ODB_GENERATE header)
SET(cxxFile "${CMAKE_SOURCE_DIR}/generated/${header}-odb.cxx")
SET(hxxFile "${CMAKE_SOURCE_DIR}/generated/${header}-odb.hxx")
SET(ixxFile "${CMAKE_SOURCE_DIR}/generated/${header}-odb.ixx")
SET(sqlFile "${CMAKE_SOURCE_DIR}/generated/${header}.sql")
SET(ODB_GENERATED_FILES ${cxxFile} ${hxxFile} ${ixxFile} ${sqlFile})
ADD_CUSTOM_COMMAND(
OUTPUT ${ODB_GENERATED_FILES}
COMMAND odb -o ${CMAKE_SOURCE_DIR}/generated/ --std c++14 -d mysql --generate-query --generate-schema
--show-sloc ${CMAKE_SOURCE_DIR}/models/${header}.hpp
DEPENDS ${CMAKE_SOURCE_DIR}/models/${header}.hpp
COMMENT "Generate database support code for ${header}.hpp")
ENDMACRO()
add_executable(${CMAKE_PROJECT_NAME}
main.cpp
models/person.cpp
generated/person-odb.cxx
)
target_link_libraries(
mtest
odb
odb-mysql
)
ODB_GENERATE(person)
编译代码,运行后查询数据库:
环境搭建完了,可以畅快的学习 odb 了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。