Метка времени в дизельной библиотеке Rust с Postgres
я смотрел на ржавчину Дизель ОРМ сегодня, следуя на это прогулк-через, и я не могу получить Timestamp
на работу.
груз.томл
[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"
модели.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
type)
Либ.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
struct с ней.
есть что-то очевидное, что я делаю неправильно здесь?
в стороне, я довольно новичок в ржавчине, и дизель использует справедливый бит генерации кода, поэтому его легко получить потеряно, но я думал, что это должно быть простой вещью для достижения.
редактировать:
я timestamp with time zone
чтобы создать таблицу, и это выглядит так возможно, еще не поддерживается:
CREATE TABLE post (
...
created timestamp with time zone NOT NULL,
updated timestamp with time zone
)
Edit 2:
я изменился модели.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>
(docs:FromSql
, Timestamp
, Pg
). Есть два типа, которые реализуют эту черту.
первое-это std::time::SystemTime
, который не требует дополнительных зависимостей, но не имеет кучу способности.
второй -chrono::NaiveDateTime
. Это, вероятно, тот тип, который вам нужен. Чтобы использовать его, вам нужно добавить chrono
к вашим зависимостям, и измените дизельную линию в грузе.toml, чтобы включить функцию chrono, так что это будет выглядеть что-то вроде diesel = { version = "0.7.0", features = ["postgres", "chrono"] }
(технически есть третий тип, который diesel::data_types::PgTimestamp
но это почти наверняка не то, что вы хотите, так что struct-это просто буквальное представление метка времени в базе данных, поэтому другим типам не нужно беспокоиться о необработанных байтах)
пожалуйста, проверьте тип данных из ui
" src / модели.rs: 16: 18:16: 27 справка: вы можете импортировать его в область:use diesel::types::Timestamp;
.
src / модели.rs: 17: 18:17: 27 ошибка: введите имя Timestamp
не определено или нет в области [E0412]
src / модели.rs: 17 паб обновлено: отметка времени"
возможно, временная метка не определяет слово.