2010-05-06 11 views
5

Sto cercando un modo per analizzare le classi/entità ORM di SQLAlchemy per determinare i tipi e altri vincoli (come le lunghezze massime) delle proprietà di un'entità.SQLAlchemy introspezione di classi ORM/oggetti

Per esempio, se ho una classe dichiarativa:

class User(Base): 
    __tablename__ = "USER_TABLE" 

    id = sa.Column(sa.types.Integer, primary_key=True) 
    fullname = sa.Column(sa.types.String(100)) 
    username = sa.Column(sa.types.String(20), nullable=False) 
    password = sa.Column(sa.types.String(20), nullable=False) 
    created_timestamp = sa.Column(sa.types.DateTime, nullable=False) 

vorrei essere in grado di scoprire che il campo 'fullname' dovrebbe essere una stringa con una lunghezza massima di 100, ed è annullabile . E il campo "created_timestamp" è un DateTime e non è annullabile.

risposta

11

Qualcosa di simile:

table = User.__table__ 
field = table.c["fullname"] 
print "Type", field.type 
print "Length", field.type.length 
print "Nullable", field.nullable 

EDIT:

L'imminente versione 0.8 ha un New Class Inspection System:

Inspection System Nuova Classe

Stato: completato, ha bisogno di documenti

Molti utenti SQLAlchemy sono sistemi che richiedono la capacità di ispezionare gli attributi di una classe mappata, tra cui la possibilità di arrivare alle colonne chiave primaria, relazioni oggettuali, pianura attributi scrittura, e così via, tipicamente per lo scopo di creare sistemi di marshalling dati , come schemi di conversione JSON/XML e librerie di moduli di corso .

In origine, il modello Tabella e Colonna erano i punti di ispezione originale , che dispongono di un sistema ben documentato. Anche se i modelli SQLAlchemy ORM sono completamente introspectable, questa non è mai stata una funzionalità completa e supportata di e gli utenti tendono a non avere un'idea chiara di come ottenere queste informazioni.

0.8 ha un piano per produrre un'API coerente, stabile e pienamente documentata per questo scopo, che fornirebbe un sistema di ispezione che funziona su classi, istanze e probabilmente anche altre cose. Mentre molti elementi di questo sistema sono già disponibili, il piano è quello di bloccare l'API tra cui vari metodi di accesso disponibili su tali oggetti come Mapper, InstanceState, e MapperProperty:

(Segui il link per maggiori informazioni)

+0

Ho passato così tanto tempo con 'dichiarativo' che mi sono dimenticato di guardare le colonne sottostanti. Grazie! –