rust - 如何使用 Diesel 编写多个显式的 inner_join?

标签 rust rust-diesel

我目前正在使用 actix_web 和diesel in Rust 开发一个api。现在回答我的问题;我正在尝试发出这样的 sql 请求:

SELECT * FROM customers c
JOIN users u ON u.name = c.customer_no
JOIN address a ON c.fk_address = a.id
WHERE a.name='10715';

有一个使用diesel进行多重连接的实际文档,但仅适用于隐式连接,可以在此处找到:

https://docs.diesel.rs/diesel/query_dsl/trait.QueryDsl.html#method.inner_join

显式和隐式有什么区别?

通过宏隐式定义关系:

users.inner_join(posts)

显式定义查询语句中的关系:

users.inner_join(posts::table.on(posts::id.eq(user::id)))

有谁知道如何使用多个显式联接发出请求:

这有效:

users.inner_join(posts.inner_join(comments))

这不是:

users.inner_join(
    posts::table.on(posts::id.eq(user::id))
        .inner_join(comments::table.on(comments::id.eq(post::id)))
)

最佳答案

您的初始 SQL 查询将使用 Diesel 编写,如下所示 ( complete example ):

customers::table
    .inner_join(users::table.on(users::name.eq(customers::customer_no)))
    .inner_join(address::table.on(address::id.eq(customers::fk_address)))
    .filter(users::name.eq("10715"));

您可能会对此保持警惕,因为 documentation on .inner_join()警告链式连接与嵌套连接不同:

Diesel expects multi-table joins to be semantically grouped based on the relationships. For example, users.inner_join(posts.inner_join(comments)) is not the same as users.inner_join(posts).inner_join(comments). The first would deserialize into (User, (Post, Comment)) and generate the following SQL:

SELECT * FROM users
    INNER JOIN posts ON posts.user_id = users.id
    INNER JOIN comments ON comments.post_id = posts.id

While the second query would deserialize into (User, Post, Comment) and generate the following SQL:

SELECT * FROM users
    INNER JOIN posts ON posts.user_id = users.id
    INNER JOIN comments ON comments.user_id = users.id

但是,所提出的问题只是一个问题,因为 joinable! 生成了隐式 ON 子句。宏。如果用户是链接的,则查询将默认将 comments 连接到 users,而不是像人们可能的那样将 comments 连接到 posts预计。当您显式提供 ON 子句时,这不是问题;由于您自己编写 JOIN 标准,因此您想要的内容没有任何歧义。

您始终可以使用debug_query如果您有任何疑问,请打印生成的 SQL。

关于rust - 如何使用 Diesel 编写多个显式的 inner_join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73559824/

相关文章:

vector - 我如何从 Rust 中的 Vec 中取出一个项目?

reference - 为什么对泛型函数中特征的引用必须实现 `Sized` ?

postgresql - 不满足特征绑定(bind) `chrono::DateTime<Utc>: FromSql<diesel::sql_types::Nullable<diesel::sql_types::Timestamptz>, Pg>`

module - 引用兄弟模块(例如 Diesel 生成的模式)的正确方法是什么?

iterator - 返回 RefCell 中 Vec 的迭代器

rust - 在 Rust 中返回可变引用

http - 如果(向客户端)传输的数据量超过了Content-Length,会发生什么情况?

rust - 无法在 Rust/Actix 应用程序中使用柴油计时功能

rust - 如何使用 Diesel 在 sqlite 中存储任意 JSON 对象

mysql - 如何将 Homebrew 安装的 mysql-client 与 diesel-cli 链接起来?