2012-11-14 1 views
9

In SQLAlchemy Declarative, wie richte ich Standardwerte für Spalten ein, so dass vorübergehende oder ausstehende Objektinstanzen diese Standardwerte haben? Ein kurzes Beispiel:Wie setze ich Attribut-Standardwerte in deklarativen SQL deklarative?

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 

Naiv, würde ich die Ausgabe von diesem erwartet adefault zu sein. Natürlich ist die Ausgabe tatsächlich None. Selbst beim Hinzufügen zu einer Sitzung bleibt es None und wird nur gefüllt, wenn ich die Sitzung festlege (oder lege) und den Instanzwert erneut aus der Datenbank lese.

Gibt es eine Möglichkeit, einen Attributstandard festzulegen, ohne die Instanz in die Datenbank zu leeren? Ich habe versucht, die ColumnDefault Dokumentation zu untersuchen, und es scheint keine offensichtliche Möglichkeit zu sein, den Typ/Python-Wert zu überprüfen, um es manuell in einer benutzerdefinierten deklarativen Basisklasse festzulegen.

+0

Siehe auch: https://stackoverflow.com/q/14002631/6646912 – krassowski

Antwort

10

Fügen Sie Ihrer Klasse einen Konstruktor hinzu und legen Sie dort den Standardwert fest. Der Konstruktor wird nicht ausgeführt, wenn die Zeilen aus der Datenbank geladen werden, daher ist es in Ordnung.

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 

Es gibt Beispiele für __init__ in ähnlicher Weise in den SA Docs verwenden.

+0

Wenn Sie sicherstellen möchten, dass eine Instanz von 'A' einen Wert für' word' hat, scheint der Konstruktor besser als ein Standardwert in der Spaltendefinition. Gibt es jemals einen Fall, in dem der Standardwert an beiden Stellen angegeben werden müsste? –

+2

Die Antwort scheint für mich überhaupt nicht zu funktionieren. Es druckt keine und __init__ wird nie aufgerufen. – user202987

+0

Es scheint nicht, dass "__init__" auf der deklarativen Basis für die tatsächlichen Modellklassen aufgerufen wird. – Rob