जाहिरा तौर पर समस्या SqlAlchemy से संबंधित नहीं है बल्कि अंतर्निहित MySQL इंजन के साथ है। डिफ़ॉल्ट व्यवहार on update CURRENT_TIMESTAMP
पर सेट करना है तालिका में पहले टाइमस्टैम्प कॉलम पर।
यह व्यवहार यहां
के बारे में बताया गया है . जहाँ तक मैं समझता हूँ, एक संभावित समाधान यह है कि MySQL को --explicit_defaults_for_timestamp=FALSE
के साथ प्रारंभ किया जाए। झंडा। दूसरा समाधान यहां
पाया जा सकता है . मैंने अभी तक किसी भी समाधान का प्रयास नहीं किया है, जैसे ही मैं समस्या का समाधान करूंगा, मैं इस उत्तर को अपडेट कर दूंगा।
संपादित करें:मैंने दूसरी विधि की कोशिश की और यह बहुत आसान नहीं है लेकिन यह काम करता है। मेरे मामले में मैंने टेबल का एक सेट बनाया है जिसमें created_at
. नहीं है विशेषता और फिर मैंने उपरोक्त लिंक में वर्णित सभी शेष तालिकाओं को बदल दिया है।
की तर्ज पर कुछ:
_no_alter = set(['tables', 'which', 'do not', 'have', 'a created_at', 'column'])
Base.metadata.create_all(engine)
for table in Base.metadata.tables.keys():
if table not in _no_alter:
engine.execute(text('ALTER TABLE {} MODIFY created_at TIMESTAMP NOT NULL DEFAULT 0'.format(table)))
EDIT2:इसे पूरा करने का एक और (आसान) तरीका है SqlAlchemy में एक server_default
सेट करना कॉलम के लिए मान:
created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))