2个版本 (1个稳定版)
1.0.0 | 2023年12月7日 |
---|---|
0.5.0 | 2023年4月27日 |
#1192 在 数据库接口
43KB
959 行
SuchBar - 用于数据库查询的终端用户可学习语言。
一种可以被普通用户学习的查询语言,类似于互联网搜索引擎。
如"plz=26440-26452 OR (Eisen AND sn!=Hammer*)
"这样的查询可以生成相应的SQL语句
SELECT
pa.shortname, pa.description, pa.taxnumber, pb.longname, pb.postcode, pb.city, pb.street
FROM partner_partner pa, partner_branchstore pb
WHERE
pa.id = pb.cmrpartner AND
(
( pb.postcode>='26440' AND
pb.postcode<='26452'
) OR
( pa.shortname LIKE '%Eisen%' OR
pa.description LIKE '%Eisen%' OR
pa.taxnumber LIKE '%Eisen%' OR
pb.city LIKE '%Eisen%' OR
pb.street LIKE '%Eisen%'
) AND
NOT pa.shortname LIKE 'Hammer%'
)
LIMIT 20;
布尔运算符 | 替代符号 | 描述 |
---|---|---|
AND | && | 布尔运算符两边的术语都必须存在才能匹配。 |
NOT | ! | 需要后面的术语不存在。 |
OR | || | 需要任一术语(或两个术语)存在才能匹配。 |
用法
注册搜索字段。
可用于搜索的字段已注册:DbField::new, db-type, "permission", &["name", "alternative_name", "abbr"]),
示例
const SUCHBAR: Suchbar = Suchbar::new(&[
DbField::new("pa.shortname", TEXT, "STD", &["sname", "sn"]),
DbField::new("pa.description", TEXT, "STD", &["desc", "d"]),
DbField::new("pa.taxnumber", VARCHAR(15), "STD", &["ust_id", "tax", "ustid"]),
DbField::new("pb.city", VARCHAR(35), "STD", &["city"]),
DbField::new("pb.street", VARCHAR(55), "STD", &["street", "st"]),
DbField::new("pb.postcode", VARCHAR(5), "STD", &["plz", "zip"]),
]);
fn main() {
let suche = "plz=26440-26452 OR (Eisen AND sn!=Hammer*)";
match SUCHBAR.exec(suche) {
Err(c) => println!("\n{c}"),
Ok(sr) => {
let query = format ! (
"SELECT pa.shortname, pa.description, pa.taxnumber, \
pb.longname, pb.postcode AS INTEGER, pb.city, pb.street \
FROM partner_partner pa, partner_branchstore pb \
WHERE pa.id = pb.cmrpartner{} LIMIT 20",
sr.to_sql("AND")
);
}
}
}
依赖项
~3MB
~60K SLoC