2013-07-23 4 views
5

के साथ MySQL टाइमस्टैम्प कॉलम मान डालें मेरे पास MySQL innoDB में डेटाबेस तालिका में एक sqlalchemy क्लास मैपिंग है। तालिका कई स्तंभ है और मैं सभी एक टाइमस्टैम्प स्तंभ से छोड़कर उन्हें सफलतापूर्वक पॉप्युलेट करने के लिए कर रहा हूँ:SqlAlchemy

मानचित्रण:

class HarvestSources(Base): 
    __table__ = Table('harvested', metadata, autoload=True) 

MySQL पर स्तंभ, एक टाइमस्टैम्प जो डिफ़ॉल्ट मान के रूप CURRENT_TIMESTAMP है लेकिन जब मैं एक पंक्ति डालता हूं जो इसे पूर्ण से भरा जा रहा है।

यदि डिफ़ॉल्ट काम नहीं कर रहा है तो मुझे टाइमस्टैम्प मैन्युअल रूप से सेट करने की आवश्यकता है, मैं उनमें से कोई भी कैसे कर सकता हूं।

SQLAlchemy कोड तालिका में पंक्ति सम्मिलित करने के लिए:

source = HarvestSources() 
source.url = url 
source.raw_data = data 
source.date = ? 

DB.session.add(source) 
DB.session.commit() 

उत्तर

10

datetime वस्तुओं timestamps में बदल रही हैं, तो आप सिर्फ उपयोग कर सकते हैं:

from datetime import datetime 
... 
source.date = datetime.now() 

या datetime.utcnow() आप यूटीसी का उपयोग कर इसे बचाने के लिए चाहते हैं। डिफ़ॉल्ट (CURRENT_TIMESTAMP) स्थानीय टाइमज़ोन का उपयोग करता है, इसलिए datetime.now() उसके करीब है - लेकिन यह हमेशा यूटीसी में समय से संबंधित डेटा स्टोर करने के लिए प्राथमिकतापूर्ण होना चाहिए, और उपयोगकर्ता को डेटा पेश करते समय केवल समय क्षेत्र रूपांतरण करना चाहिए।

6

माता उत्तर एक टाइमस्टैम्प मूल्य जोड़ने के तरीके पर बहुत स्पष्ट है। यदि आप टाइमस्टैम्प को automaticallyinsert और update पर जोड़ना चाहते हैं। आप बेसमिक्सिन क्लास पर विचार कर सकते हैं और प्रत्येक वर्ग के लिए स्क्लेल्चेमी कार्यक्रम पंजीकृत कर सकते हैं। उदाहरण कार्यान्वयन के नीचे है:

class BaseMixin(object): 

    __table_args__ = {'mysql_engine': 'InnoDB'} 

    id = sa.Column(sa.Integer, primary_key=True) 
    created_at = sa.Column('created_at', sa.DateTime, nullable=False) 
    updated_at = sa.Column('updated_at', sa.DateTime, nullable=False) 

    @staticmethod 
    def create_time(mapper, connection, instance): 
    now = datetime.datetime.utcnow() 
    instance.created_at = now 
    instance.updated_at = now 

    @staticmethod 
    def update_time(mapper, connection, instance): 
    now = datetime.datetime.utcnow() 
    instance.updated_at = now 

    @classmethod 
    def register(cls): 
    sa.event.listen(cls, 'before_insert', cls.create_time) 
    sa.event.listen(cls, 'before_update', cls.update_time) 

अपने class HarvestSources(Base):class HarvestSources(Base, BaseMixin): लिए बदल जाते हैं। अपने मॉडल init पर HarvestSources.register() पर कॉल करें। updated_at और created_at कॉलम स्वचालित रूप से अपडेट हो जाएगा।