2010-05-06 5 views
5

Je cherche un moyen d'introspecter les classes/entités SQLAlchemy ORM pour déterminer les types et autres contraintes (comme les longueurs maximales) des propriétés d'une entité.SQLAlchemy introspection des classes/objets ORM

Par exemple, si j'ai une classe déclarative:

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) 

Je voudrais être en mesure de savoir que le champ « fullname » doit être une chaîne avec une longueur maximale de 100, et est annulable . Et le champ 'created_timestamp' est un DateTime et n'est pas Nullable.

Répondre

11

Quelque chose comme:

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

EDIT:

La prochaine 0.8 version dispose d'une New Class Inspection System:

nouvelle classe système d'inspection

Statut: Terminé, a besoin docs

Beaucoup d'utilisateurs sqlalchemy sont les systèmes d'écriture qui nécessitent la capacité d'inspecter les attributs d'une classe cartographiés, pouvoir obtenir les colonnes de clé primaire, les relations d'objet, simples attributs, et ainsi de suite, généralement pour le but de construire systèmes de rassemblement de données, comme les schémas de conversion JSON/XML et de bibliothèques de formulaires de cours à gogo.

À l'origine, le modèle de table et de colonne étaient les points d'inspection initiaux , qui ont un système bien documenté. Alors que les modèles SQLAlchemy ORM sont également entièrement introspectables, cela n'a jamais été une fonctionnalité entièrement stable et pris en charge, et les utilisateurs avaient tendance à ne pas avoir une idée claire de comment obtenir cette information.

0.8 a un plan pour produire une API cohérente, stable et entièrement documentée à cet effet, qui fournirait un système d'inspection qui fonctionne sur les classes, les instances, et éventuellement d'autres choses. Alors que de nombreux éléments de ce système sont déjà disponibles, le plan est de verrouiller l'API, y compris les accesseurs de ces objets comme Mapper, InstanceState et MapperProperty:

(suivre le lien pour plus d'informations)

+0

J'ai passé tellement de temps avec 'declarative' que j'ai oublié de regarder les colonnes sous-jacentes. Merci! –

Questions connexes