2016-07-30 20 views
6

के साथ जंग की डीजल लाइब्रेरी में टाइमस्टैम्प मैं आज this walk-through पर निम्नलिखित द्वारा जंग के 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 
           ^~~~~~~~~ 

यह पहली त्रुटि की तरह दिखता है, Timestamptzinfer_schema का एक परिणाम यह जानकर, कि Postgresql प्रकार व्याख्या करने के लिए कैसे नहीं है जो पहले से ही टेबल में है। दूसरे के लिए, मैंने सोचा कि शायद Timestamp प्रकार को स्पष्ट रूप से आयात किया गया है, तो मैं इसके साथ Post संरचना बना सकता हूं।

क्या कुछ स्पष्ट है कि मैं यहां गलत कर रहा हूं?

एक तरफ, मैं जंग के लिए काफी नया हूं और डीजल कोड-पीढ़ी के एक उचित बिट का उपयोग करता है, इसलिए खोना आसान है, लेकिन मैंने सोचा कि यह पूरा करने के लिए एक सीधी चीज होनी चाहिए।


संपादित:

मैं तालिका बनाने के लिए timestamp with time zone इस्तेमाल किया, और यह कि may not be supported yet की तरह दिखता है:

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

संपादित करें 2:

मैंने models.rs को निम्न जैसा दिखने के लिए बदल दिया और Timestamp को अपरिभाषित होने के बारे में त्रुटि से छुटकारा पा लिया। मुझे यह भी एहसास हुआ कि मुझे प्राप्त होने वाले प्रत्येक structs के ऊपर #[derive(Queryable)] की आवश्यकता है। निम्नलिखित ठीक संकलित, लेकिन Timestamptz के साथ पिछले त्रुटियां रह: 16::

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 
} 
+1

ऐसा लगता है कि यह अभी तक समर्थित नहीं है , इसलिए मुझे अब के लिए एक मूर्ख समय के साथ जाना होगा: https://github.com/diesel-rs/diesel/issues/106 – erewok

+2

आप जानते हैं कि ओआरएम के बारे में मेरा पसंदीदा हिस्सा इनपुट स्वच्छता है इसलिए मुझे एसक्यूएल इंजेक्शन के बारे में ज्यादा सोचें। मैंने उन्हें लीकी अबास्ट्रक्शन कहा है और यह शायद सच है क्योंकि आपको अधिकतर ओआरएम का प्रभावी ढंग से उपयोग करने के लिए बहुत सारे एसक्यूएल जानना है। बेशक, आपको SQL प्रकारों में और बाहर बॉयलरप्लेट मार्शलिंग प्रकारों का एक टन भी लिखना होगा। क्या आपने SQLalchemy का उपयोग किया है? यह मेरे सीमित अनुभव में सर्वश्रेष्ठ प्रदर्शन करता है। – erewok

+0

ओआरएम रास्ते में आते हैं, धीमे प्रश्न लिखते हैं, और प्रोग्रामर से समस्याओं को छिपाते हैं। आप गंभीर रूप से बेवकूफ चीजें कर सकते हैं, लेकिन जब तक आप एसक्यूएल स्टेटमेंट्स को बेवकूफ़ बनाते हैं तो बेवकूफ ओआरएम लिख रहा है, तब तक आप कभी नहीं जानते होंगे कि जब तक आप कुत्ते को धीमा नहीं करते हैं और महसूस करते हैं कि आप पूरी तरह से जुड़ने के साथ क्रमिक स्कैन कर रहे हैं कोई अच्छा कारण नहीं है। –

उत्तर

12

diesel::sql_types में सभी प्रकार आपके स्कीमा के लिए विभिन्न एसक्यूएल डेटाटाइप का प्रतिनिधित्व करने के लिए मार्कर हैं। उन्हें अपने स्वयं के structs में कभी भी इस्तेमाल नहीं किया जाना चाहिए। आपको जो चाहिए वह एक प्रकार है जो diesel::deserialize::FromSql<diesel::sql_types::Timestamp, diesel::pg::Pg> लागू करता है (दस्तावेज़: FromSql, Timestamp, Pg)। दो प्रकार हैं जो उस गुण को लागू करते हैं।

पहला std::time::SystemTime है जो अतिरिक्त निर्भरताओं की आवश्यकता नहीं है, लेकिन इसमें क्षमता का एक टन नहीं है।

दूसरा chrono::NaiveDateTime है। यह शायद वह प्रकार है जिसे आप चाहते हैं। आदेश में इसका इस्तेमाल करने के लिए आपको तो यह diesel = { version = "0.7.0", features = ["postgres", "chrono"] }

तरह दिखाई देगा अपने निर्भरता को chrono जोड़ने के लिए, और Cargo.toml में डीजल लाइन बदलने के लिए chrono सुविधा शामिल करना होगा, (तकनीकी तौर पर वहाँ एक तीसरा प्रकार है , जो diesel::data_types::PgTimestamp है लेकिन यह निश्चित रूप से निश्चित रूप से आप नहीं चाहते हैं, क्योंकि यह संरचना डेटाबेस में टाइमस्टैम्प का शाब्दिक प्रतिनिधित्व है, इसलिए अन्य प्रकारों को कच्चे बाइट्स के बारे में चिंता करने की ज़रूरत नहीं है)

0

ui

"src/models.rs से डेटाप्रकार की जाँच करें 18: 16:27 सहायता: आप में आयात कर सकते हैं स्कोप:। use diesel::types::Timestamp; src/models.rs: 17: 18: 17:27 त्रुटि: प्रकार का नाम Timestamp अपरिभाषित या दायरे में नहीं है [E0412] src/models.rs: 17 पब अद्यतन: समय-चिह्न "

शायद टाइमस्टैम्प शब्द परिभाषित नहीं है।

+0

एक चीज जिसके बारे में आप सही थे: मैंने गलती से गलत फ़ाइल में उस प्रकार का आयात किया! – erewok