web-dev-qa-db-ja.com

Postgresを使用したRustのディーゼルライブラリのタイムスタンプ

私はRustの 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タイプを解釈する方法を知らない結果です。 2つ目は、その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
}
_
20
erewok

diesel::sql_types のすべてのタイプは、スキーマのさまざまなSQLデータ型を表すマーカーです。独自の構造体で使用しないでください。必要なのは、diesel::deserialize::FromSql<diesel::sql_types::Timestamp, diesel::pg::Pg>を実装するタイプです(ドキュメント: FromSqlTimestampPg )。その特性を実装する2つのタイプがあります。

1つ目は std::time::SystemTime です。これは追加の依存関係を必要としませんが、大量の機能はありません。

2番目は chrono::NaiveDateTime です。これはおそらくあなたが望むタイプです。これを使用するには、依存関係に chrono を追加し、Cargo.tomlのディーゼルラインを変更してクロノ機能を含める必要があります。 diesel = { version = "0.7.0", features = ["postgres", "chrono"] }のように

(技術的には3番目のタイプがあります diesel::data_types::PgTimestamp ですが、その構造体はデータベース内のタイムスタンプのリテラル表現であり、他のタイプにはないため、これはほぼ確実に必要なものではありません。生のバイトについて心配する)

22
sgrif

uIからデータ型を確認してください

"src/models.rs:16:18:16:27ヘルプ:スコープにインポートできます:use diesel::types::Timestamp;。 src/models.rs:17:18:17:27エラー:タイプ名Timestampが未定義であるか、スコープ内にありません[E0412] src/models.rs:17 pub更新:タイムスタンプ "

タイムスタンプがWordを定義していない可能性があります。

0
Murat YANAR