2012-11-14 13 views
9

स्क्लेक्लेमी घोषणात्मक में, मैं कॉलम के लिए डिफ़ॉल्ट मान कैसे सेट करूं, जैसे कि क्षणिक या लंबित ऑब्जेक्ट उदाहरणों में वे डिफ़ॉल्ट मान होंगे? एक छोटी उदाहरण:मैं sqlalchemy घोषणात्मक में विशेषता डिफ़ॉल्ट मान कैसे सेट करूं?

from sqlalchemy import Column, Integer, String 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class A(Base): 
    __tablename__ = "A" 
    id = Column(Integer, primary_key=True) 
    word = Column(String, default="adefault") 

a = A() 
print a.word 

भोलेपन से, मैं इस से उत्पादन adefault होने की अपेक्षा करेंगे। बेशक, आउटपुट वास्तव में None है। सत्र में जोड़ने पर भी, यह None रहता है और जब मैं सत्र (या फ्लश) करता हूं तो केवल तभी भर जाता है, और डेटाबेस से इंस्टेंस मान को फिर से पढ़ता है।

क्या डेटाबेस में उदाहरण को फ़्लश किए बिना एक विशेषता डिफ़ॉल्ट सेट करने का कोई तरीका है? मैंने ColumnDefault दस्तावेज़ीकरण की जांच करने की कोशिश की, और टाइप/पायथन मूल्य का निरीक्षण करने के लिए एक स्पष्ट तरीका प्रतीत नहीं होता है, ताकि इसे मैन्युअल रूप से कस्टम घोषणात्मक बेसक्लास में सेट किया जा सके।

+0

यह भी देखें: https://stackoverflow.com/q/14002631/6646912 – krassowski

उत्तर

10

अपनी कक्षा में एक कन्स्ट्रक्टर जोड़ें और वहां डिफ़ॉल्ट मान सेट करें। जब डेटाबेस से पंक्तियां लोड की जाती हैं तो कन्स्ट्रक्टर नहीं चलता है, इसलिए ऐसा करना ठीक है।

class A(Base): 
    __tablename__ = "A" 
    id = Column(Integer, primary_key=True) 
    word = Column(String) 

    def __init__(self): 
     self.word = "adefault" 

a = A() 
print a.word 

SA Docs में इसी तरह के तरीकों से __init__ उपयोग करने के उदाहरण हैं।

+0

यदि आप गारंटी देना चाहते हैं कि 'ए' के एक उदाहरण के पास 'शब्द' का मान है, तो कन्स्ट्रक्टर डिफ़ॉल्ट मान से बेहतर लगता है कॉलम परिभाषा। क्या कोई ऐसा मामला है जहां आपको दोनों जगहों पर डिफ़ॉल्ट निर्दिष्ट करने की आवश्यकता होगी? –

+2

उत्तर मेरे लिए बिल्कुल काम नहीं करता है। यह किसी को प्रिंट नहीं करता है और __init__ कभी नहीं कहा जाता है। – user202987

+0

ऐसा नहीं लगता है कि घोषणात्मक आधार पर '__init__' वास्तविक मॉडल कक्षाओं के लिए कहा जाता है। – Rob

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