gpt4 book ai didi

rust - 如何使用 Diesel 格式化 SQL 结果?

转载 作者:行者123 更新时间:2023-12-03 11:48:58 25 4
gpt4 key购买 nike

我正在使用 Diesel 使用 JOIN 查询 PostgreSQL 中的数据库:

let product_id = 1;
sales::table
.inner_join(product::table)
.select((
product::description,
sales::amount,
sales::date_sale
))
.filter(sales::product_id.eq(product_id))
.load(&diesel::PgConnection)

我的模型:
pub struct Sales {
pub id: i32,
pub product_id: Option<i32>,
pub amount: Option<BigDecimal>,
pub date_sale: Option<NaiveDateTime>
}

结果符合预期,但我需要为字段 sales::date_sale 提供日期格式在 pgadmin 中我使用 to_char(date_sale, 'dd/mm/YYYY') .

是否可以使用 to_char在 Diesel 中,或者我可以通过什么方式修改 Diesel ORM 带给我的数据?

最佳答案

除了 harmic 提供的答案外还有两种可能性可以解决这个问题。

sql_function!

Diesel 提供了一个接口(interface),可以轻松地为柴油本身不提供的 sql 函数定义查询 ast 节点。鼓励用户使用此功能自行定义缺失的功能。 (事实上​​,diesel 在内部使用相同的方法为开箱即用的 sql 函数定义查询 ast 节点)。定义的查询 ast 节点在其表达式类型有效的每个上下文中都可用,因此它可以在 select 和 where 子句中使用。
(这基本上是上面原始 sql 解决方案的类型安全版本)

对于给定的问题,这样的事情应该有效:

#[derive(Queryable)]
pub struct Sales {
pub id: i32,
pub product_id: Option<i32>,
pub amount: Option<BigDecimal>,
pub date_sale: Option<String>,
}

sql_function! {
fn to_char(Nullable<Timestamp>, Text) -> Nullable<Text>;
}

let product_id = 1;
sales::table
.inner_join(product::table)
.select((
product::description,
sales::amount,
to_char(sales::date_sale, "dd/mm/YYYY")
))
.filter(sales::product_id.eq(product_id))
.load(&diesel::PgConnection);


#[derive(Queryable)] + #[diesel(deserialize_as = "Type")]

柴油机 Queryable派生提供了一种在加载时通​​过自定义属性应用某些类型操作的方法。结合 chrono harmic 提供的解决方案这给出了以下变体:

#[derive(Queryable)]
pub struct Sales {
pub id: i32,
pub product_id: Option<i32>,
pub amount: Option<BigDecimal>,
#[diesel(deserialize_as = "MyChronoTypeLoader")]
pub date_sale: Option<String>
}

struct MyChronoTypeLoader(Option<String>);

impl Into<Option<String>> for MyChronoTypeLoader {
fn into(self) -> String {
self.0
}
}

impl<DB, ST> Queryable<ST, DB> for MyChronoTypeLoader
where
DB: Backend,
Option<NaiveDateTime>: Queryable<ST, DB>,
{
type Row = <Option<NaiveDateTime> as Queryable<ST, DB>>::Row;

fn build(row: Self::Row) -> Self {
MyChronoTypeLoader(Option::<NaiveDateTime>::build(row).map(|d| d.format("%d/%m/%Y").to_string()))
}
}

关于rust - 如何使用 Diesel 格式化 SQL 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61418494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com