pgupdate!("for_test", 56, {
"content": "null", "tatol": Some(200), "uid": None, }
PostgreSQL 数据库连接方法封装
use pgsql_quick::{PostgresQuick, pg_run_vec, pg_run_drop ...};
pub fn postgres_conn() -> postgres::Client {
let mut client = PostgresQuick::new("host=127.0.0.1 user=username password=xxx dbname=db").unwrap().client;
client
}
let mut client = postgres_conn();
PostgreSQL 查询方法
运行sql |
说明 |
pg_run_vec |
执行sql,返回vec类型数据,无数据则返回vec![] |
pg_run_drop |
执行sql,无返回数据,最多返回id |
pg_run_tran_vec |
事务执行sql,有返回vec类型数据,无数据则返回vec![] |
pg_run_tran_drop |
事务执行sql,无返回数据,最多返回id |
let id: u64 = pg_run_drop(&mut client, sql).unwrap();
let data: Vec<serde_json::Value> = pg_run_vec(&mut client, sql).unwrap();
sql快捷生成
sql快捷生成方法 |
说明 |
pgcount |
返回计数的sql |
pgdel |
删除一条数据的sql |
pgdelmany |
批量删除数据的sql |
pgfind |
查寻数据的sql |
pgget |
查寻一条数据的sql |
pgset |
新增一条数据的sql |
pgsetmany |
批量新增数据的sql |
pgsetupdate |
批量新增或更新数据的sql |
pgsetupdatemany |
批量新增或更新数据的sql |
pgupdate |
更新一条数据的sql |
pgupdatemany |
批量更新数据的sql |
自定义 |
可以直接写自己的sql语句 |
以下内容,则为常用sql的快捷方法
let id = pg_run_drop(&mut client, pgset!("for_test", {
"content": "ADFaadf",
"uid": 9,
"info": Some('a'),
})).unwrap();
pg_run_drop(&mut client, pgdel!("for_test", 50)).unwrap();
pg_run_drop(&mut client, pgupdate!("for_test", 56, {
"content": "更新后的内容",
"tatol": Some(200),
})).unwrap();
let msql_2 = pgsetmany!("for_test", vec![
Item {uid: 1, content: "批量更新00adf"},
Item {uid: 2, content: "2342341"},
Item {uid: 3, content: "mmmmm"},
])
pg_run_drop(&mut client, msql).unwrap();
let sql = pgupdatemany!("for_test", "uid", vec![
Item {uid: 1, content: "批量更新00adf"},
Item {uid: 2, content: "2342341"},
])
pg_run_drop(&mut client, sql).unwrap();
let sql1 = pgget!("for_test", 33, "id, content as cc");
#[derive(Serialize, Deserialize, Debug)]
struct Feedback {
id: u64,
cc: String
}
let res_get: Vec<Feedback> = pg_run_vec(&mut client, sql1).unwrap();
let sql_f = pgfind!("for_test", {
p0: ["uid", ">", 330],
r: "p0",
select: "*",
});
let res_find: Vec<Feedback> = pg_run_vec(&mut client, sql_f).unwrap();
let res_count: Vec<PostgresQuickCount> = pg_run_vec(&mut client, pgcount!("for_test", {})).unwrap();
let list: Vec<serde_json::Value> =
pg_run_vec(&mut client, "select distinct type_v3 from dishes".to_owned()).unwrap();
PostgreSQL 事务示例
pg_run_tran_vec、pg_run_tran_drop
use pgsql_quick::{PG_EXCLUSIVE_LOCK, PG_SHARED_LOCK};
let mut client = postgres_conn();
let mut tran = client.transaction().unwrap();
let getsql = pgget!("for_test", 5, "id,title,content,price,total,uid") + PG_EXCLUSIVE_LOCK;
let get_data: Vec<ForTestItem> = pg_run_tran_vec(&mut tran, getsql).unwrap();
let tmp = get_data;
if tmp.len() == 0 {
tran.rollback().unwrap();
} else {
if tmp[0].total <= 0 {
tran.rollback().unwrap();
} else {
let sql2 = pgupdate!("for_test", 5, {"total": ["incr", -1]});
pg_run_tran_drop(&mut tran, sql2).unwrap();
tran.commit().unwrap();
}
}
组合查询
通过 Sql 包裹
use pgsql_quick::Sql;
let sql1 = pgfind!("hospital", {
p0: ["hospital_name", "like", "信息%"],
r: "p0",
select: "hospital_id",
});
let sql2 = pgcount!("database.patient", { p0: ["investigation_id", "=", Sql("investigation.investigation_id")],
r: "p0",
});
let sql = pgfind!("investigation", {
j1: ["hospital_id", "inner", "hospital.hospital_id"],
p0: ["hospital_id", "in", Sql(sql1)],
p1: ["inv_type", "=", "门诊"],
r: "p0 && p1",
select: "investigation_id, hospital_id, (".to_string()
+ sql2.as_str() + ") as patient_count", });
println!("sql>>>>> {} \n", sql);