Отметка времени в дизельной библиотеке Руста с Postgres

Я смотрел на Rust's Diesel ORM сегодня, следуя этой инструкции, и я не могу получить Timestamp работать.

Cargo.toml

[dependencies]
diesel = { version = "0.6.2", features = ["chrono"] }
diesel_codegen = { version = "0.6.2", default-features = false, features = ["nightly", "postgres"] }
dotenv = "0.8.0"
dotenv_macros = "0.8.0"

models.rs

#[derive(Queryable)]

pub struct Author {
    pub id: i32,
    pub first_name: String,
    pub last_name: String,
    pub email: String
}

pub struct Post {
    pub id: i32,
    pub author: Author,
    pub title: String,
    pub body: String,
    pub published: bool,
    pub created: Timestamp,
    pub updated: Timestamp
}

(Я читал, что есть diesel::types::Timestamp тип)

lib.rs

#![feature(custom_derive, custom_attribute, plugin)]
#![plugin(diesel_codegen, dotenv_macros)]

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

pub mod schema;
pub mod models;

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

pub fn establish_connection() -> PgConnection {
    dotenv().ok();

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

Но вот ошибки, которые я получаю, когда пытаюсь его использовать:

<diesel macros>:5:1: 5:71 note: in this expansion of table_body! (defined in <diesel macros>)
src/schema.rs:1:1: 1:40 note: in this expansion of table! (defined in <diesel macros>)
src/schema.rs:1:1: 1:40 note: in this expansion of infer_schema! (defined in src/lib.rs)
src/lib.rs:1:1: 1:1 help: run `rustc --explain E0412` to see a detailed explanation
src/lib.rs:1:1: 1:1 help: no candidates by the name of `Timestamptz` found in your project; maybe you misspelled the name or forgot to import an external crate?
src/lib.rs:1:1: 1:1 error: type name `Timestamptz` is undefined or not in scope [E0412]
src/lib.rs:1 #![feature(custom_derive, custom_attribute, plugin)]

...

<diesel macros>:38:1: 38:47 note: in this expansion of column! (defined in <diesel macros>)
<diesel macros>:5:1: 5:71 note: in this expansion of table_body! (defined in <diesel macros>)
src/schema.rs:1:1: 1:40 note: in this expansion of table! (defined in <diesel macros>)
src/schema.rs:1:1: 1:40 note: in this expansion of infer_schema! (defined in src/lib.rs)
src/lib.rs:1:1: 1:1 help: run `rustc --explain E0412` to see a detailed explanation
src/lib.rs:1:1: 1:1 help: no candidates by the name of `Timestamptz` found in your project; maybe you misspelled the name or forgot to import an external crate?
src/models.rs:16:18: 16:27 error: type name `Timestamp` is undefined or not in scope [E0412]
src/models.rs:16     pub created: Timestamp,
                              ^~~~~~~~~
src/models.rs:16:18: 16:27 help: run `rustc --explain E0412` to see a detailed explanation
src/models.rs:16:18: 16:27 help: you can import it into scope: `use diesel::types::Timestamp;`.
src/models.rs:17:18: 17:27 error: type name `Timestamp` is undefined or not in scope [E0412]
src/models.rs:17     pub updated: Timestamp
                              ^~~~~~~~~

Похоже, первая ошибка, Timestamptz является результатом infer_schema не зная, как интерпретировать тот тип Postgresql, который уже находится в таблице. Что касается второго, я подумал, возможно, если явно импортировать, что Timestamp типа, я мог бы создать Post структура с этим.

Есть ли что-то очевидное, что я здесь делаю не так?

Кроме того, я довольно новичок в Rust, и Diesel использует довольно много кода, поэтому легко потеряться, но я подумал, что это должно быть простым делом.


Редактировать:

я использовал timestamp with time zone создать таблицу, и похоже, что это еще не поддерживается:

CREATE TABLE post (
    ...
    created timestamp with time zone NOT NULL,
    updated timestamp with time zone
)

Изменить 2:

Я изменил models.rs, чтобы он выглядел следующим образом, и избавился от ошибки Timestamp быть неопределенным. Я также понял, что мне нужно #[derive(Queryable)] над каждой из структур, которые будут получены. Следующий компилирует нормально, но предыдущие ошибки с Timestamptz остаются:

use diesel::types::Timestamp;

#[derive(Queryable)]
pub struct Author {
    pub id: i32,
    pub first_name: String,
    pub last_name: String,
    pub email: String
}

#[derive(Queryable)]
pub struct Post {
    pub id: i32,
    pub author: Author,
    pub title: String,
    pub body: String,
    pub published: bool,
    pub created: Timestamp,
    pub updated: Timestamp
}

2 ответа

Решение

Все типы в diesel::sql_types являются маркерами для представления различных типов данных SQL для вашей схемы. Они никогда не должны использоваться в ваших собственных структурах. Что вам нужно, это тип, который реализует diesel::deserialize::FromSql<diesel::sql_types::Timestamp, diesel::pg::Pg> (документы: FromSql, Timestamp, Pg). Есть два типа, которые реализуют эту черту.

Первый std::time::SystemTime который не требует дополнительных зависимостей, но не имеет тонны возможностей.

Второй chrono::NaiveDateTime, Это, вероятно, тот тип, который вы хотите. Для того, чтобы использовать его, вам нужно добавить chrono к вашим зависимостям, и измените дизельную линию в Cargo.toml, чтобы включить функцию хронографа, чтобы она выглядела примерно так diesel = { version = "0.7.0", features = ["postgres", "chrono"] }

(Технически есть третий тип, который diesel::data_types::PgTimestamp но это почти наверняка не то, что вам нужно, так как эта структура является буквальным представлением метки времени в базе данных, поэтому другим типам не нужно беспокоиться о необработанных байтах)

Пожалуйста, проверьте тип данных от пользовательского интерфейса

"src/models.rs:16:18: 16:27 help: вы можете импортировать его в область видимости: use diesel::types::Timestamp;, src/models.rs:17:18: 17:27 ошибка: имя типа Timestamp не определено или не входит в область действия [E0412] src/models.rs:17 паб обновлен: отметка времени "

возможно отметка времени не определяет слово.

Другие вопросы по тегам