2009-01-05 11 views
35

SQLAlchemy का DateTime प्रकार डेटाबेस को गैर-बेवकूफ डेटाटाइम ऑब्जेक्ट को सहेजने के लिए timezone=True तर्क के लिए अनुमति देता है, और इसे वापस करने के लिए अनुमति देता है। क्या tzinfo के टाइमज़ोन को संशोधित करने का कोई तरीका है जो एसक्यूएलकेमी पास हो जाता है, उदाहरण के लिए, यूटीसी हो सकता है? मुझे एहसास है कि मैं सिर्फ default=datetime.datetime.utcnow का उपयोग कर सकता हूं; हालांकि, यह एक बेवकूफ समय है जो किसी को बेवकूफ लोकलटाइम-आधारित डेटाटाइम में गुजरने वाले किसी व्यक्ति को खुशी से स्वीकार करेगा, भले ही मैंने timezone=True का उपयोग किया हो, क्योंकि यह स्थानीय या यूटीसी समय को गैर-निष्पक्ष बनाता है बिना बेस टाइमज़ोन को सामान्यीकृत करने के लिए। मैंने डेटाटाइम ऑब्जेक्ट को गैर-बेवकूफ बनाने के लिए (pytz का उपयोग करके) कोशिश की है, लेकिन जब मैं इसे डीबी में सहेजता हूं तो यह बेवकूफ के रूप में वापस आता है।SQLAlchemy DateTime timezone

नोट कैसे datetime.datetime.utcnow timezone=True साथ इतनी अच्छी तरह से काम नहीं करता है:

import sqlalchemy as sa 
from sqlalchemy.sql import select 
import datetime 

metadata = sa.MetaData('postgres://user:[email protected]/db') 

data_table = sa.Table('data', metadata, 
    sa.Column('id', sa.types.Integer, primary_key=True), 
    sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.utcnow) 
) 

metadata.create_all() 

engine = metadata.bind 
conn = engine.connect() 
result = conn.execute(data_table.insert().values(id=1)) 

s = select([data_table]) 
result = conn.execute(s) 
row = result.fetchone() 

(1, datetime.datetime (2009, 1, 6, 0, 9, 36, 891,887))

row[1].utcoffset() 

datetime.timedelta (-1, 64800) # कि मेरे स्थानीयसमय ऑफसेट है !!

datetime.datetime.now(tz=pytz.timezone("US/Central")) 

datetime.timedelta (-1, 64800)

datetime.datetime.now(tz=pytz.timezone("UTC")) 

datetime.timedelta (0) #UTC

यहां तक ​​कि अगर मैं इसे बदल यूटीसी का स्पष्ट रूप से उपयोग करने के लिए:

...

data_table = sa.Table('data', metadata, 
    sa.Column('id', sa.types.Integer, primary_key=True), 
    sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.now(tz=pytz.timezone('UTC'))) 
) 

row[1].utcoffset() 

...

datetime.timedelta (-1, 64800) # यह समय क्षेत्र का उपयोग नहीं किया मैं स्पष्ट रूप से

या अगर मैं ड्रॉप जोड़ा timezone=True:

...

data_table = sa.Table('data', metadata, 
    sa.Column('id', sa.types.Integer, primary_key=True), 
    sa.Column('date', sa.types.DateTime(), default=datetime.datetime.now(tz=pytz.timezone('UTC'))) 
) 

row[1].utcoffset() is None 

...

यह सच है तो यह और भी # db करने के लिए एक समय क्षेत्र इस समय

उत्तर

17

http://www.postgresql.org/docs/8.3/interactive/datatype-datetime.html#DATATYPE-TIMEZONES

सभी समय क्षेत्र अवगत दिनांक और समय बचाने के लिए नहीं किया था जमा हो जाती है आंतरिक रूप से यूटीसी में। वे क्लाइंट को प्रदर्शित होने से पहले टाइमज़ोन कॉन्फ़िगरेशन पैरामीटर द्वारा निर्दिष्ट जोन में स्थानीय समय में परिवर्तित हो जाते हैं।

पोस्टग्रेस्क्ल के साथ इसे स्टोर करने का एकमात्र तरीका इसे अलग से स्टोर करना है।

+0

संग्रहीत डेटाबेस में datetime_with_timzone में "टाइमज़ोन कॉन्फ़िगरेशन पैरामीटर" टाइमज़ोन जानकारी है? –

+1

@Ciastopiekarz नहीं। 'टाइमज़ोन' कॉन्फ़िगरेशन पैरामीटर क्लाइंट कनेक्शन पैरामीटर है। 'समय क्षेत्र के साथ डेटाटाइम', जिसका मूल्य यूटीसी में संग्रहीत किया जाता है, इसे प्रदर्शित करने या वापस करने से पहले इस 'टाइमज़ोन' पैरामीटर में निर्दिष्ट टाइमज़ोन में परिवर्तित हो जाता है। अपने वर्तमान कनेक्शन के लिए क्या मूल्य है यह देखने के लिए 'SHOW टाइमज़ोन' का उपयोग करें। आपको वास्तव में क्या चाहिए इसकी सोच के बारे में सोचें: क्या आपको कोई ईवेंट होने पर समय को स्टोर करने की आवश्यकता है, या आपको जानकारी संग्रहीत करने की भी आवश्यकता है जिसमें संग्रहीत डेटाटाइम मान वास्तव में उत्पन्न हुआ है? यदि यह उत्तरार्द्ध है, तो आपको इस जानकारी को अलग से स्टोर करने की आवश्यकता है। – compostus

+0

अगर मुझे केवल यह पता चल गया कि यह कब हुआ लेकिन यूटीसी में, शायद यह मौजूदा कनेक्शन है, तो टाइमज़ोन जानकारी के बिना मुझे कभी पता नहीं चलेगा कि उपयोगकर्ता का सही समय कब हुआ था। –

5

एक समाधान this question’s जवाब में दी गई है:

आप यूटीसी में अपने डेटाबेस में सभी (तारीख) समय वस्तुओं के भंडारण, और पुनः प्राप्ति पर जागरूक लोगों के परिणामस्वरूप भोली दिनांक वस्तुओं परिवर्तित करके कि दरकिनार कर सकते हैं।

एकमात्र कमी यह है कि आप टाइमज़ोन जानकारी खो देते हैं, लेकिन संभवतः यूटैक में अपने डेटाटाइम ऑब्जेक्ट्स को स्टोर करना एक अच्छा विचार है।

अगर आप समय क्षेत्र जानकारी के बारे में परवाह, मैं इसे अलग से स्टोर चाहते हैं, और केवल यूटीसी (जैसे सही प्रदर्शित करने से पहले) अंतिम संभव उदाहरण में स्थानीय समय में कनवर्ट

या हो सकता है आप की जरूरत नहीं है सभी के बाद देखभाल करें, और उस मशीन से स्थानीय टाइमज़ोन जानकारी का उपयोग कर सकते हैं, जिस पर आप अपना प्रोगोग चलाते हैं, या उपयोगकर्ता का ब्राउज़र यदि यह वेबपैप है।

+0

यदि हम या तो टाइमज़ोन जानकारी खो देते हैं लेकिन फिर भी यूटीसी में दिनांक/समय को सहेजने में सक्षम हैं तो टाइम टाइमोन के साथ दिनांक समय को 'timestamptz' के बजाय' string' प्रकार के परिभाषित एक कॉलम में क्यों नहीं बचाएं? –