Rust Diesel Library 使用 Timestamptz 反序列化 Postgres DateTIme,

Rust Diesel Library Deserialising Postgres DateTIme with Timestamptz,

错误是:-

  > src/lib.rs:45:14
       |
    45 |             .load::<Store>(&conn)
       |              ^^^^ the trait 

`diesel::deserialize::FromSql<diesel::sql_types::Timestamptz, _>` is not implemented for `bool`

我的up.sql是:--

CREATE TABLE store (
    id SERIAL PRIMARY KEY,
    name VARCHAR(500) NOT NULL,
    description VARCHAR(2000) NOT NULL,
    created_at timestamp with TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at timestamp with TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    is_active boolean DEFAULT 'f' NOT NULL,
    created_by integer NOT NULL,
    address_id integer NOT NULL
);

SELECT diesel_manage_updated_at('store');

我的模型文件:-

use diesel::{Insertable, Queryable};
use serde::{Deserialize, Serialize};
use chrono::{ DateTime, Utc };

use crate::schema::{store, item, store_item};

use std::convert::From;

#[derive(Deserialize, Serialize, Queryable)]
pub struct Store {
    pub id: i32,
    pub name: String,
    pub description: String,
    pub is_active: bool,
    pub created_by: i32,
    pub address_id: i32,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
}

我的测试文件:-

#[macro_use]
extern crate diesel;
extern crate dotenv;

pub mod schema;
pub mod models;



#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {

        use diesel::prelude::*;
        use diesel::pg::PgConnection;
        use dotenv::dotenv;
        use std::env;

        dotenv().ok();

        let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
        let conn = PgConnection::establish(&database_url).expect(&format!("Error connecting to {}", database_url));

        let sid: i32 = 1;
        use crate::models::{Store, NewStore};
        use crate::schema::store::dsl::*;

        let new_store = NewStore {
            name: "Top in town stores".to_owned(),
            description: "this is top in town stores".to_owned(),
            is_active: true,
            created_by: 22,
            address_id: 3322
        };

        let sam: usize = diesel::insert_into(store).values(&new_store).execute(&conn).unwrap();

        let user = store
            .filter(id.eq(sid))
            .limit(1)
            .load::<Store>(&conn)
            .expect("Error loading posts");

        assert_eq!(1, 1);
    }
}

我的货物文件:-

[package]
name = "database"
version = "0.1.0"
authors = ["spiderman"]
edition = "2018"


# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
diesel = { version="1.4.5", features = ["postgres", "extras", "chrono"] }

chrono = { version = "0.4", features = ["serde", "rustc-serialize"] }

serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
dotenv = "*"

我从 diesel cli 自动生成的架构 :-

table! {
    item (id) {
        id -> Int4,
        name -> Varchar,
        description -> Varchar,
        created_at -> Timestamptz,
        updated_at -> Timestamptz,
        is_active -> Bool,
        created_by -> Int4,
    }
}

table! {
    store (id) {
        id -> Int4,
        name -> Varchar,
        description -> Varchar,
        created_at -> Timestamptz,
        updated_at -> Timestamptz,
        is_active -> Bool,
        created_by -> Int4,
        address_id -> Int4,
    }
}

table! {
    store_item (id) {
        id -> Int4,
        store_id -> Nullable<Int4>,
        item_id -> Nullable<Int4>,
        created_at -> Timestamptz,
        updated_at -> Timestamptz,
        is_active -> Bool,
        created_by -> Int4,
    }
}

joinable!(store_item -> item (item_id));
joinable!(store_item -> store (store_id));

allow_tables_to_appear_in_same_query!(
    item,
    store,
    store_item,
);

仅当我添加日期时间字段时出现问题,如果我将其从 sql 和模型中删除,则不会出现问题,

我认为您的问题是由于字段顺序引起的。您的 SQL 中的字段顺序与您的模型结构不匹配。

来自Diesel Getting Started

Using #[derive(Queryable)] assumes that the order of fields on the Post struct matches the columns in the posts table, so make sure to define them in the order seen in the schema.rs file.

错误消息说它无法将 Bool 转换为时间戳,所以我认为它混淆了您的 is_active 和其中一个日期字段。