2012-11-14 10 views
9

In SQLAlchemy dichiarativo, come si impostano i valori predefiniti per le colonne, in modo che le istanze di oggetti transitori o in sospeso abbiano quei valori predefiniti? Un breve esempio:Come imposto i valori predefiniti degli attributi in sqlalchemy dichiarativo?

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 

Ingenuamente, io mi aspetterei che l'uscita da questo per essere adefault. Ovviamente, l'output è in realtà None. Anche quando si aggiunge a una sessione, rimane None e viene riempito solo quando commetto (o svuoto) la sessione e rileggo il valore dell'istanza dal database.

C'è un modo per impostare un attributo predefinito senza svuotare l'istanza nel database? Ho provato a studiare la documentazione ColumnDefault e non sembra che sia un modo ovvio per ispezionare il tipo/valore python, in modo da impostarlo manualmente in una baseclass dichiarativa personalizzata.

+0

Vedere anche: https://stackoverflow.com/q/14002631/6646912 – krassowski

risposta

10

Aggiungi un costruttore alla classe e imposta lì il valore predefinito. Il costruttore non viene eseguito quando le righe vengono caricate dal database, quindi è corretto farlo.

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 

Ci sono esempi di utilizzo __init__ in modo simile nel SA Docs.

+0

Se si desidera garantire che un'istanza di 'A' abbia un valore per' word', il costruttore sembra migliore di un valore predefinito nel definizione della colonna. C'è mai un caso in cui dovresti avere il valore predefinito specificato in entrambi i posti? –

+2

La risposta non sembra funzionare affatto per me. Stampa None e __init__ non viene mai chiamato. – user202987

+0

Non sembra che '__init__' sulla base dichiarativa sia chiamato per le classi di modello attuali. – Rob

Problemi correlati