2011-08-09 9 views
12

मैं sqlalchemy के साथ टेबल बना रहा हूँ।sqlalchemy के साथ mysql में अद्यतन CURRENT_TIMESTAMP पर डिफॉल्ट सेट कैसे करें?

user = Table('users', Metadata, 
Column('datecreated', TIMESTAMP,         
      server_default=text('CURRENT_TIMESTAMP')),    
Column('datemodified', TIMESTAMP,         
       server_onupdate=text('CURRENT_TIMESTAMP')), 
) 

लेकिन यह अद्यतन CURRENT_TIMESTAMP पर डिफॉल्ट सेट नहीं करेगा।

मैं इस लिंक को चेक करता हूं, How do you get SQLAlchemy to override MySQL "on update CURRENT_TIMESTAMP" लेकिन शाब्दिक के लिए मुझे टेबल परिभाषा बनाने में इसे तार करने की आवश्यकता होगी।

अग्रिम में :)

उत्तर

11

आप MySQL 5.6 पर हैं या बाद में प्रासंगिक जवाब के लिए नीचे स्क्रॉल करें Thx। पुराने संस्करणों के उपयोगकर्ता, कृपया इसे पढ़ें।


MySQL 5.6 तक। एक तालिका में, आपके पास केवल एक 'स्वचालित' TIMESTAMP कॉलम हो सकता है।

से: http://dev.mysql.com/doc/refman/5.5/en/timestamp.html

एक तालिका में एक TIMESTAMP स्तंभ के लिए, आप डिफ़ॉल्ट मान और स्वत: अपडेट मूल्य के रूप में वर्तमान टाइमस्टैम्प प्रदान कर सकते हैं। संभव है कि वर्तमान टाइमस्टैम्प के लिए डिफ़ॉल्ट मान हो, कॉलम को प्रारंभ करने के लिए, ऑटो-अपडेट मान या दोनों के लिए। यह संभव नहीं है कि वर्तमान टाइमस्टैम्प एक कॉलम और दूसरे कॉलम के लिए स्वत: अद्यतन मान के लिए डिफ़ॉल्ट मान हो।

Column('datemodified', TIMESTAMP, 
     server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')) 

यह निम्न स्तंभ प्रविष्टि उत्पन्न करता है:

+0

अगर मैं 'उपयोगकर्ता = तालिका ('उन', मेटाडाटा, स्तंभ ('DateCreated', DATETIME), स्तंभ ('datemodified', TIMESTAMP, server_onupdate = पाठ ('CURRENT_TIMESTAMP')) लिखेंगे, ) ' फिर यह अद्यतन CURRENT_TIMESTAMP पर DEFAULT के लिए काम करेगा? – Nilesh

+0

मैंने इस उदाहरण के साथ जांच की है लेकिन यह अद्यतन CURRENT_TIMESTAMP पर डिफॉल्ट सेट नहीं है। जब हम एकल कॉलम के लिए उपयोग करते हैं। :( – Nilesh

+0

यदि यह संभव नहीं है तो कृपया मुझे बताएं कि मैं sqlalchemy में onupdate ट्रिगर कैसे सेट कर सकता हूं? – Nilesh

12

तुम भी पर अद्यतन स्थापित करने के लिए server_default अपहरण कर सकते हैं

datemodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

हालांकि, Mchl का जवाब अभी भी लागू होता है: वहाँ केवल हो सकता है एक तालिका में एक स्वचालित TIMESTAMP कॉलम (http://dev.mysql.com/doc/refman/5.5/en/timestamp.html)

यह भी ध्यान दें कि कॉल का क्रम शरद ऋतु महत्वपूर्ण है! यदि आपके पास DEFAULT और UPDATE संशोधक के बिना TIMESTAMP कॉलम है, और यह आपकी तालिका में पहला टाइमस्टैम्प कॉलम है, यह स्वचालित रूप से अद्यतन CURRENT_TIMESTAMP पर DEFAULT CURRENT_TIMESTAMP पर सेट हो जाएगा। (http://dev.mysql.com/doc/refman/5.5/en/timestamp.html)

तो यह ठीक है:

Column('datemodified', TIMESTAMP, 
     server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')) 
Column('datecreated', TIMESTAMP) 

इस जबकि नहीं है:

Column('datecreated', TIMESTAMP) 
Column('datemodified', TIMESTAMP, 
     server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')) 

`एक पंक्ति के पहले प्रवेश के दौरान वर्तमान समय के DateCreated 'सेट करने के लिए, बस इसके मूल्य को स्पष्ट रूप से न्यूल पर सेट करें। फिर, http://dev.mysql.com/doc/refman/5.5/en/timestamp.html से:

डिफ़ॉल्ट रूप से, TIMESTAMP कॉलम नहीं NULL, कर रहे हैं शून्य मूल्यों को शामिल नहीं कर सकते हैं और बताए शून्य वर्तमान टाइमस्टैम्प प्रदान करती है।

+0

यह मेरे लिए काम करने का एकमात्र तरीका था, 'server_onupdate = text (' CURRENT_TIMESTAMP ') का कोई संयोजन नहीं होगा। यदि आप mysql 5.6+ पर हैं (जो , अब तक, ज्यादातर लोगों को होना चाहिए), यह स्वीकार्य उत्तर होना चाहिए। – domoarrigato

4
Column('datemodified', 
     TIMESTAMP,         
     server_onupdate=text(
      ' ON UPDATE '.join([str(func.current_timestamp())] * 2))) 

इस तरह आप SQLAlchemy के भीतर func.current_timestamp() समारोह का उपयोग करें।

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