2010-07-31 18 views
7

Escribo un pequeño shlalchemy shim para exportar datos desde una base de datos MySQL con algunas transformaciones de datos livianas, la mayoría de las veces cambiando los nombres de los campos. Mi secuencia de comandos actual funciona bien, pero necesito que describa básicamente mi modelo dos veces: una vez en la declaración de clase y una vez como una lista de nombres de campo para iterar.introspección SQLAlchemy de las clases declarativas

Estoy tratando de averiguar cómo usar la introspección para identificar propiedades en objetos de fila que son accesadores de columna. Las siguientes obras: casi perfectamente

for attr, value in self.__class__.__dict__.iteritems(): 
    if isinstance(value, sqlalchemy.orm.attributes.InstrumentedAttribute): 
     self.__class__._columns.append(attr) 

excepto que mis-a-muchos descriptores de acceso de relación son también ejemplos de sqlalchemy.orm.attributes.InstrumentedAttribute, y tengo que saltar aquellos. ¿Hay alguna manera de distinguir entre los dos mientras estoy inspeccionando el diccionario de la clase?

La mayor parte de la documentación que encuentro sobre introspección de sqlalchemy implica mirar metadata.table, pero desde que cambio el nombre de las columnas, esos datos no se pueden mapear trivialmente.

Respuesta

1

Todavía me gustaría ver una respuesta a esta pregunta, pero he solucionado el problema modificando los nombres de los descriptores de acceso (por ejemplo, "_herramienta" en lugar de "otrenicidad") y luego filtrado en el nombre. Funciona bien para mis propósitos.

7

El asignador de cada entidad asignada tiene un atributo columns con todas las definiciones de columna. Por ejemplo, si usted tiene una clase declarativa User se puede acceder al asignador con User.__mapper__ y las columnas con:

list(User.__mapper__.columns) 

Cada columna tiene varios atributos, incluyendo name (que podría no ser el mismo que el atributo mapeado llamado key), nullable, unique y así sucesivamente ...

+0

Esto parece ser más útil en general que inspeccionar metadata.tables ['mytable']. Columnas, pero no parece que me permita descubrir la variable de clase a la que se asigna el descriptor en mi clase de entidad, entonces Me queda el problema original de cómo producir un mapeo de salida de los nombres de propiedad de clase a sus valores. –

1

un ejemplo InstrumentedAttribute tiene un un atributo llamado impl que es en la práctica un ScalarAttributeImpl, un ScalarObjectAttributeImpl, o una CollectionAttributeImpl.

No estoy seguro de qué tan frágil es esto, pero solo compruebo cuál es para determinar si una instancia finalmente devolverá una lista o un solo objeto.

Cuestiones relacionadas