odb 使用指南(四)数据库查询

背景最近一直在看odb官网上odb-manual,由于是全英文文档,仔细看过一遍之后虽然感觉基本了解,但是隔几天之后再翻开时又要逐一回忆当初理解的一些细节,毕竟不是母语,没有那种一看就条件反射式的想起来,所以把一些key word记录下来,避免下次重复花时间来消化知识。对于一个coder,能够用代码来阐述的,就尽量不用文字,所以在记录过程中尽量通过代码来展示一些api的用法。使用说明本文基于...
摘要由CSDN通过智能技术生成

背景

最近一直在看odb官网上odb-manual,由于是全英文文档,仔细看过一遍之后虽然感觉基本了解,但是隔几天之后再翻开时又要逐一回忆当初理解的一些细节,毕竟不是母语,没有那种一看就条件反射式的想起来,所以把一些key word记录下来,避免下次重复花时间来消化知识。对于一个coder,能够用代码来阐述的,就尽量不用文字,所以在记录过程中尽量通过代码来展示一些api的用法。

使用说明

本文基于odb官方手册为指导,通过自己的理解之后用尽可能通俗易懂的文字来阐述相关用法。站在应用编程的角度,将文档中常用知识点、易错点进行翻译整理。同时本文也弱化掉了一些不常用的知识点,基于这种考虑主要是由于本文的立足点是为了使编程人员尽快上手开发,如果将一些不常用的知识点也罗列其中会显得繁杂且冗余,所以如果在开发过程中遇到本文未提及的点可以回到odb官方手册进行查询。

数据库的查询(query)

上一章我们讲到查询时,提到过如果需要query时,在odb编译选项中需要指定–generate-query的编译选项,讲述之前先看例子

typedef odb::query<person> query;
typedef odb::result<person> result;
unsigned short age;
query q (query::first == "John" && query::age < query::_ref (age));
for (age = 10; age < 100; age += 10)
{
   
    result r (db.query<person> (q));
    ...
}

我们可以使用odb query输入字符串的方式来进行查询,比如像这样子

query q ("first = ’John’ AND age = " + query::_ref (age));

也可以通过指定静态成员变量的方式,比如:

query q (query::first == 123 && query::agee < query::_ref (age));

但是,如果你观察得足够仔细,你就会发现上面的语句会在编译阶段报错,第一个错误会告诉你query::first是一个字符串,而123是一个整形,没法比较,第二个错误是因为query::agee的拼写错误了(正确的是query::age)。假如我们通过字符串的方式输入参数,同样的将上面的错误带入其中,像下面这个样子

query q ("first = 123 AND agee = " + query::_ref (age));

这时我们无法在编译阶段发现自动发现问题,只会在运行时才会发现错误。另外我们可以将这两种方式结合起来使用,比如像这个样子

query q ("first = ’John’ AND" + (query::age < query::_ref (age)));
  1. odb query语言

    odb query语句实际上是一个表达式,表达式的结果为true或者false。多个表达式之间可以通过逻辑运算符连起来,比如&&(AND),||(OR),!(NOT),举例说明:

    typedef odb::query<person> query;
    query q (query::first == "John" || query::age == 31);
    

    每个查询表达式的核心是包含一个或多个对象成员,值或参数。如果我们想使用类的成员变量来构成我们的查询表达式,那么我们可以使用类似query::first这样表示成员变量,如果你的成员变量名称为m_first或者_first,那么我们再使用它时还是像这样query::first来表示,odb会自动删除成员变量的一些公共部分前缀,比如m_,或者_等,常用的一些表达式列表如下所示


    Operator Description Example
    == equal query::age == 31
    != unequal query::age != 31
    < less than query::age < 31
    > greater than query::age > 31
    <= less than or equal query::age <= 31
    >= greater than or equal query::age >= 31
    in() one of the values query::age.in (30, 32, 34)
    in_range() one of the values in range query::age.in_range (begin, end)
    like() matches a pattern query::first.like (“J%”)
    is_null() value is NULL query::age.is_null ()
    is_not_null() value is NOT NULL query::age.is_not_null ()

    函数in()最多可以接受5个参数,如果你需要多余5个参数的话,可以使用in_range()函数。使用举例:

    std::vector<string> names;
    
    names.push_back ("John");
    names.push_back ("Jack");
    names.push_back ("Jane");
    
    query q1 (query::first.in ("John", "Jack", "Jane"));
    query q2 (query::first.in_range (names.begin (), names.end ()));
    

    我们可以通过like()函数的第一个参数来针对特定字符串进行模式匹配,比如使用%(匹配0个或多个字符)和_(完全匹配一个字符),第二个参数来告诉系统哪些字符是转义字符。比如我希望匹配由下划线开头和结尾的任意字符串,我们可以这样写:

    query q (query::name.like ("_!__", "!"));
    

    多个表达式之间的优先级与c++语法针对多表达式优先级一致,我们可以使用括号来指定优先级,比如像这样

    query q ((query::first == "John" || query::first == "Jane") && query::age < 31);
    
  2. 参数绑定

    我们可以通过query::_val()来绑定一个对象的值,也可以通过query::_ref()来绑定一个对象的引用。用起来就像这样子

    string name 
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值