返回使用 Rocket 和 Diesel (Rust) 在 PostgreSQL 中创建的单个记录

Posted

技术标签:

【中文标题】返回使用 Rocket 和 Diesel (Rust) 在 PostgreSQL 中创建的单个记录【英文标题】:Return single record created in PostgreSQL using Rocket and Diesel (Rust) 【发布时间】:2020-05-18 10:33:07 【问题描述】:

我正在尝试根据以下教程构建一个简单的 Web 应用程序:one、two 和 three。它们都使用略有不同的方法,并且是为使用的库的旧版本编写的,因此当前的 Diesel 和 Rocket API 略有不同。我想响应 POST 请求返回创建的记录或记录 ID。此时我只能返回记录列表 - 单个记录列表(尝试返回单个记录,基于 Vec.first() 不编译)。

Cargo.toml

[dependencies]
# chrono is needed with serialization/deserialisation options
chrono =  version = "0.4.10", features = ["serde"] 
diesel =  version = "1.4.3", features = ["postgres", "chrono", "network-address"] 
ipnetwork = "0.15.1"
dotenv = "0.9.0"

# Lazy static initialization
lazy_static = "1.3.0"

# Rocket Webserver
rocket = "0.4.2"
rocket_contrib = version = "0.4.2", features = ["json", "diesel_postgres_pool"]

# Connection pooling
r2d2 = "0.8.7"
r2d2-diesel = "1.0.0"

# Serialization/Deserialization
serde = "1.0.104"
serde_json = "1.0.44"
serde_derive = "1.0.104"

models.rs

#![allow(proc_macro_derive_resolution_fallback)]
use crate::schema::bs_date_forecast;

use chrono::NaiveDate, NaiveDateTime;
use ipnetwork::IpNetwork;
use diesel::prelude::*;

#[derive(Queryable, Insertable, Serialize, Deserialize)]
#[table_name="bs_date_forecast"]
pub struct BsDateForecast 
    pub id: Option<i32>,
    pub predicted_date: NaiveDate,
    pub seer_ip: IpNetwork,
    pub created_timestamp: NaiveDateTime,  // Defined automatically at the database level


impl BsDateForecast 

    // Would like to return the record (BsDateForecast) instead, but don't know how
    pub fn create(forecast: BsDateForecast,
                  conn: &PgConnection) -> QueryResult<Vec<BsDateForecast>> 
        diesel::insert_into(bs_date_forecast::table)
            .values(&forecast)
            .get_results(conn)
    


schema.rs

table! 
    bs_date_forecast (id) 
        id -> Nullable<Int4>,
        predicted_date -> Date,
        seer_ip -> Inet,
        created_timestamp -> Timestamptz,
    

routes.rs

use diesel::self, prelude::*;

use rocket_contrib::json::Json, JsonValue;
use rocket::response::status;

use crate::models::BsDateForecast;
use crate::schema;
use crate::DbConn;
use serde_json::Value;



#[post("/predictions", format = "application/json", data = "<prediction>")]
pub fn create(prediction: Json<BsDateForecast>, conn: DbConn) -> Json<Vec<BsDateForecast>> 
    let insert = BsDateForecastid: None, ..prediction.into_inner();
    Json(BsDateForecast::create(insert, &conn))

【问题讨论】:

【参考方案1】:

这就像更改从数据库加载值的函数一样简单。

impl BsDateForecast 

    // Would like to return the record (BsDateForecast) instead, but don't know how
    pub fn create(forecast: BsDateForecast,
                  conn: &PgConnection) -> QueryResult<BsDateForecast> 
        diesel::insert_into(bs_date_forecast::table)
            .values(&forecast)
            .get_result(conn)
    


详见RunQueryDsl的文档(和其他可用方法)

【讨论】:

天啊,有两种方法:get_resultget_results... 我完全错过了。不能再误导了。希望他们有更多杰出的名字。 如果您有更好的名称建议,请在柴油 github 存储库中打开一个问题。

以上是关于返回使用 Rocket 和 Diesel (Rust) 在 PostgreSQL 中创建的单个记录的主要内容,如果未能解决你的问题,请参考以下文章

diesel.rs 和rocket.rs:不明白为啥它需要一个数据库表

带有 Rocket 和 Diesel 的多租户 Web 应用程序

使用 Diesel 从 mySQL 数据库中检索日期时间

Diesel 获取单亲和许多孩子 - 火箭

我无法安装diesel-cli以与火箭一起使用[重复]

使用 r2d2 在 rust/diesel 应用程序中实现连接池