अपने डीबी के भीतर टाइमस्टैम्प की गणना करें, न कि आपके ग्राहक की
पवित्रता के लिए, आप शायद datetimes
अपने DB सर्वर द्वारा सभी की गणना करना चाहते हैं , बजाय अनुप्रयोग सर्वर के। एप्लिकेशन में टाइमस्टैम्प की गणना करने से समस्याएं हो सकती हैं क्योंकि नेटवर्क विलंबता परिवर्तनशील है, ग्राहक थोड़ा अलग घड़ी बहाव का अनुभव करते हैं, और विभिन्न प्रोग्रामिंग भाषाओं में कभी-कभी समय की थोड़ी अलग गणना करते हैं।
SQLAlchemy आपको इसे पारित करने की अनुमति देता है func.now()
या func.current_timestamp()
(वे एक दूसरे के उपनाम हैं) जो DB को टाइमस्टैम्प की गणना करने के लिए कहता है।
SQLALchemy का प्रयोग करें server_default
इसके अतिरिक्त, एक डिफ़ॉल्ट के लिए जहां आप पहले से ही डीबी को मूल्य की गणना करने के लिए कह रहे हैं, आमतौर पर server_default
इसके बजाय इसका उपयोग करना बेहतर होता है default
। यह SQLAlchemy को CREATE TABLE
कथन के भाग के रूप में डिफ़ॉल्ट मान देने के लिए कहता है ।
उदाहरण के लिए, यदि आप इस तालिका के विरुद्ध एक तदर्थ स्क्रिप्ट लिखते हैं, तो server_default
इसका उपयोग करके आपको अपनी स्क्रिप्ट में टाइमस्टैम्प कॉल को मैन्युअल रूप से जोड़ने के बारे में चिंता करने की आवश्यकता नहीं होगी - डेटाबेस इसे स्वचालित रूप से सेट करेगा।
SQLAlchemy onupdate
/ को समझनाserver_onupdate
SQLAlchemy भी समर्थन करता है onupdate
ताकि कभी भी पंक्ति को अपडेट किया जाए यह एक नया टाइमस्टैम्प सम्मिलित करता है। फिर से, डीबी को खुद टाइमस्टैम्प की गणना करने के लिए कहना सबसे अच्छा है:
from sqlalchemy.sql import func
time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())
एक server_onupdate
पैरामीटर है, लेकिन इसके विपरीत server_default
, यह वास्तव में कुछ भी सर्वराइड सेट नहीं करता है। यह सिर्फ SQLalchemy को बताता है कि अपडेट होने पर आपका डेटाबेस कॉलम को बदल देगा (शायद आपने कॉलम पर ट्रिगर बनाया है ), इसलिए SQLAlchemy रिटर्न वैल्यू मांगेगा ताकि यह संबंधित ऑब्जेक्ट को अपडेट कर सके।
एक अन्य संभावित गोटचा:
आपको यह जानकर आश्चर्य हो सकता है कि यदि आप किसी एकल लेन-देन में परिवर्तन करते हैं, तो वे सभी समान टाइमस्टैम्प रखते हैं। ऐसा इसलिए है क्योंकि SQL मानक निर्दिष्ट करता है कि CURRENT_TIMESTAMP
लेनदेन की शुरुआत के आधार पर मान लौटाता है।
PostgreSQL गैर-SQL- मानक प्रदान करता है statement_timestamp()
और clock_timestamp()
जो एक लेन-देन के भीतर परिवर्तन करते हैं। डॉक्स यहां: https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
UTC टाइमस्टैम्प
यदि आप UTC टाइमस्टैम्प का उपयोग करना चाहते हैं, तो SQLAlchemy प्रलेखनfunc.utcnow()
में कार्यान्वयन का एक स्टब प्रदान किया जाता है । आपको अपने दम पर उपयुक्त ड्राइवर-विशिष्ट फ़ंक्शन प्रदान करने की आवश्यकता है।