2010-03-27 16 views
22

मैं स्क्लाक्लेमी के साथ काम कर रहा हूं, और मुझे अभी तक यकीन नहीं है कि मैं किस डेटाबेस का उपयोग करूंगा, इसलिए मैं जितना संभव हो डीबी-अज्ञेयवादी के रूप में रहना चाहता हूं। मैं एक विशिष्ट डेटाबेस में खुद को टाई बिना डीबी में टाइमज़ोन-जागरूक डेटाटाइम ऑब्जेक्ट कैसे स्टोर कर सकता हूं? अभी, मैं यह सुनिश्चित कर रहा हूं कि डीबी में उन्हें स्टोर करने से पहले यूटीसी समय हो, और डिस्प्ले-टाइम पर स्थानीयकरण में परिवर्तित हो जाए, लेकिन यह सुरुचिपूर्ण और भंगुर महसूस करता है। क्या डीबी से बाहर निकलने वाले डाटाटाइम ऑब्जेक्ट्स प्राप्त करने के बजाय एसक्यूएलकेमी से टाइमज़ोन-जागरूक डेटाटाइम प्राप्त करने के लिए कोई डीबी-अज्ञेय तरीका है?क्या सक्लाक्चेमी डेटटाइम ऑब्जेक्ट्स केवल बेवकूफ हो सकते हैं?

उत्तर

40

पैरामीटर DateTime कॉलम समय पर पैरामीटर है, इसलिए टाइमज़ोन-जागरूक datetime ऑब्जेक्ट्स को संग्रहीत करने में कोई समस्या नहीं है। हालांकि मैं सरल प्रकार डेकोरेटर के साथ स्वचालित रूप UTC से datetime संग्रहीत कन्वर्ट करने के लिए सुविधाजनक पाया:

from sqlalchemy import types 
from dateutil.tz import tzutc 
from datetime import datetime 

class UTCDateTime(types.TypeDecorator): 

    impl = types.DateTime 

    def process_bind_param(self, value, engine): 
     if value is not None: 
      return value.astimezone(tzutc()) 

    def process_result_value(self, value, engine): 
     if value is not None: 
      return datetime(value.year, value.month, value.day, 
          value.hour, value.minute, value.second, 
          value.microsecond, tzinfo=tzutc()) 

ध्यान दें, कि अच्छी तरह से व्यवहार करने के तरीके यदि आपने गलती से अनुभवहीन datetime का उपयोग (अर्थात यह एक ValueError बढ़ा देंगे) है।

+0

यह लिखित रूप में काम नहीं करता है, इसे 'process_bind_param' में एक मामूली tweak की आवश्यकता है:' def process_bind_param (self, value, engine): \ n यदि मान कोई नहीं है: \ n यदि value.tzinfo कोई नहीं है: \ n वापसी value.replace (tzinfo = tzutc()) \ n else: \ n वापसी value.astimezone (tzutc()) ' –

+9

@ जेसे ढिल्लों: बेवकूफ डेटाटाइम ऑब्जेक्ट्स के आकस्मिक भंडारण को रोकने के लिए जानबूझकर है, जबकि आपकी नुस्खा गलत तरीके से किसी को छेड़छाड़ करती है यूटीसी होने के नाते किसी भी समय क्षेत्र के साथ डेटाटाइम। –

+6

@ डेनिस, तो अपने प्रकार का उपयोग करके, किसी को केवल टाइमज़ोन-जागरूक 'डेटाटाइम' ऑब्जेक्ट्स बनाने और स्टोर करने की उम्मीद है? अब जब मैं समझता हूं कि, मुझे आपके समाधान को और अधिक पसंद है क्योंकि उपयोगकर्ता को यह जानने की आवश्यकता है कि वे क्या सहेज रहे हैं। –

संबंधित मुद्दे