2010-05-06 20 views
5

Estoy buscando una forma de introspectar clases/entidades SQLAlchemy ORM para determinar los tipos y otras restricciones (como longitudes máximas) de las propiedades de una entidad.Introspección SQLAlchemy de clases/objetos ORM

Por ejemplo, si tengo una clase declarativa:

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) 

me gustaría ser capaz de descubrir que el 'fullname' campo debe ser una cadena con una longitud máxima de 100, y es anulable . Y el campo 'created_timestamp' es DateTime y no puede contener nulos.

Respuesta

11

Algo así como:

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

EDIT:

La próxima versión 0.8 tiene una New Class Inspection System:

Sistema de inspección Nueva Clase

Estado: finalizado, necesita docs

Muchos de los usuarios SQLAlchemy están escribiendo los sistemas que requieren la capacidad para inspeccionar los atributos de una clase asignada, además de ser capaz de llegar a las columnas de clave principal, las relaciones de objeto, llano atributos, y así sucesivamente, por lo general para el propósito de construir sistemas de clasificación de datos, como esquemas de conversión JSON/XML y de bibliotecas de formularios de cursos en abundancia.

Originalmente, el modelo de tabla y columna eran los puntos de inspección originales , que tienen un sistema bien documentado. Mientras que los modelos SQLAlchemy ORM también son totalmente introspectivos, esto nunca ha sido una característica totalmente estable y compatible con , y los usuarios tendían a no tener una idea clara de para obtener esta información.

0.8 tiene un plan para producir una API consistente, estable y totalmente documentada para este propósito, que proporcionaría un sistema de inspección que funciona en clases, instancias y posiblemente también en otras cosas. Mientras muchos elementos de este sistema ya están disponibles, el plan es de bloqueo hacia abajo la API que incluye diversos métodos de acceso disponibles en dichos objetos como Mapper, InstanceState y MapperProperty:

(Siga el enlace para más información)

+0

He estado pasando tanto tiempo con 'declarative' que olvidé todo sobre mirar las columnas subyacentes. ¡Gracias! –