前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于 cmake 构建 odb 应用

基于 cmake 构建 odb 应用

原创
作者头像
祥祥
修改2021-01-13 18:06:12
1.1K0
修改2021-01-13 18:06:12
举报
文章被收录于专栏:大写的CPP大写的CPP

本文不是 odb 的教程,只是介绍如何在 WSL2 下使用 cmake 搭建 odb 应用的编译环境。

ODB 是什么?

ODB 是 c++ 的对象持久化工具,底层支持的数据库包括 mysql/pgsql/sqlite/sqserver/oracle。更多关于 odb 的信息可以参考官网手册

基础环境

我的开发环境是 WSL2 + vscode。

安装所需依赖:

代码语言:shell
复制
sudo apt-get install odb
sudo apt-get install libmysqlclient-dev   # 我使用 mysql,需要安装 Mysql 开发库

g++7.5 不支持 odb2.4,需要回退到 g++7.3

代码语言:shell
复制
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:

代码语言:c++
复制
#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

代码语言:c++
复制
#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

代码语言:c++
复制
#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

代码语言:c
复制
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)

编译代码,运行后查询数据库:

success
success

环境搭建完了,可以畅快的学习 odb 了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ODB 是什么?
  • 基础环境
  • 示例代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档