我有一个函数,它接受两个可选的过滤参数,如果提供了这些参数,则过滤表中的数据。为此,我创建了一个盒装查询。我想用这个盒装查询创建一个正确的连接。Diesel 的当前文档没有提到右连接,但它似乎更喜欢这种belonging_to方法。我已将我的代码简化为一个示例:
#[macro_use] extern crate diesel;
use diesel::prelude::*;
table! {
groups (id) {
id -> Int4,
name -> Text,
}
}
table! {
user_groups (id) {
id -> Int4,
user_id -> Int4,
group_id -> Int4,
}
}
allow_tables_to_appear_in_same_query!(groups, user_groups);
#[derive(Debug, Queryable)]
struct Group {
id: i32,
name: String,
}
#[derive(Debug, Queryable, Associations)]
#[belongs_to(Group)]
struct UserGroup {
id: i32,
user_id: i32,
group_id: i32,
}
fn filter(
name: Option<&str>,
user_id: Option<i32>,
conn: &diesel::PgConnection,
) -> Result<Vec<(Group, Vec<UserGroup>)>, Box<dyn std::error::Error>> { …Run Code Online (Sandbox Code Playgroud) 我有一个用Rust编写的API,它的目标是在数据库中公开~15个表.我已经编写了几个非常相似的函数来公开每个表,所以我认为我会对多态性进行破解以简化代码.
我已将所有代码缩减为单个文件:
#[macro_use]
extern crate diesel;
extern crate dotenv;
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
table! {
table1 (id) {
id -> Int4,
value -> Text,
}
}
table! {
table2 (id) {
id -> Int4,
value -> Text,
}
}
#[derive(Identifiable, Queryable, Serialize)]
#[table_name = "table1"]
struct Model1 {
pub id: i32,
pub value: String,
}
#[derive(Identifiable, Queryable, Serialize)]
#[table_name = "table2"]
struct Model2 {
pub id: i32,
pub value: String,
}
use dotenv::dotenv;
use …Run Code Online (Sandbox Code Playgroud) 我正在使用 Rocket 创建一个带有身份验证的 web 应用程序。为此,我创建了一个User实现FromRequest. 它采用授权标头,其中包含一个 JSON Web 令牌。我反序列化此令牌以获取有效负载,然后从数据库中查询用户。这意味着FromRequest实现需要一个diesel::PgConnection. 在 Rocket 0.3 中,这意味着调用PgConnection::establish,但在 Rocket 0.4 中,我们可以访问连接池。通常我会按如下方式访问这个连接池:
fn get_data(conn: db::MyDatabasePool) -> MyModel {
MyModel::get(&conn)
}
Run Code Online (Sandbox Code Playgroud)
但是,在 impl 块中,FromRequest我不能只将conn参数添加到函数的参数列表中from_request。如何在请求保护之外访问我的连接池?