2012-11-14 166 views
9

在SQLAlchemy的聲明,我該如何設置默認值的列,這樣短暫的或未決的對象實例將這些默認值嗎?簡單例子:如何設置在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文檔,並且似乎沒有被檢查的類型/ Python的價值,從而爲手動設置在一個自定義的聲明基類的明顯的方式。

+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

如果要確保'A'的實例具有「word」的值,則構造函數看起來好於缺省值列定義。是否有過這種情況,您需要在兩個地方都指定默認值? –

+2

答案似乎並不適用於我。它打印None並且__init__永遠不會被調用。 – user202987

+0

對於實際的模型類,聲明基礎上的__init__似乎沒有被調用。 – Rob