2009-12-31 15 views
6

Me gustaría representar un tipo de datos como una sola columna en mi modelo, pero realmente los datos se almacenarán en varias columnas en la base de datos. No puedo encontrar ningún recurso bueno sobre cómo hacer esto en SQLAlchemy.SQLAlchemy Tipo personalizado que contiene varias columnas

Me gustaría que mi modelo a tener este aspecto (esto es un ejemplo simplificado el uso de la geometría en lugar de mi verdadero problema, que es más difícil de explicar):

class 3DLine(DeclarativeBase): 
    start_point = Column(my.custom.3DPoint) 
    end_point = Column(my.custom.3DPoint) 

De esta manera pude asignar un objeto con el (x, y, z) componentes del punto a la vez sin establecerlos individualmente. Si tuviera que separar cada componente, podría ponerse feo, especialmente si cada clase tiene varios de estos objetos compuestos. Combinaría los valores en un campo codificado, excepto que necesito consultar cada valor por separado a veces.

Pude averiguar cómo crear tipos personalizados utilizando una sola columna in the documentation. Pero no hay ninguna indicación de que pueda asignar un solo tipo a múltiples columnas.

Supongo que podría lograr esto utilizando una tabla separada, y cada columna sería una clave externa, pero en mi caso no creo que tenga sentido tener un mapeo uno a uno para cada punto a un punto separado tabla, y esto todavía no da la capacidad de establecer los valores relacionados, todo a la vez.

Respuesta

7

Aquí está un ejemplo mínimo basado en documentation:

class 3DPoint(object): 
    def __init__(self, x, y, z): 
     self.x = x 
     self.y = y 
     self.z = z 

    def __composite_values__(self): 
     return (self.x, self.y, self.z) 

class 3DLine(DeclarativeBase): 
    start_point = sqlalchemy.orm.composite(
     3DPoint, 
     Column('start_point_x', Integer, nullable=False), 
     Column('start_point_y', Integer, nullable=False), 
     Column('start_point_z', Integer, nullable=False), 
    ) 
+0

Esto es ideal para el uso de una sola vez, sin embargo, este enfoque hace que sea imposible de factorizar a cabo como un tipo separado, en casos como el de arriba cuando hay son dos campos compuestos del mismo tipo (punto de inicio y punto final) - habrá duplicación de nombres de columna. ¿Es posible utilizar la inferencia automática de los nombres de columna que funciona para campos de una sola columna, y simplemente anexar "_x", "_y" y "_z" a ella? (Meta: ¿debería hacer una pregunta por separado sobre SO sobre esto?) – Veky

Cuestiones relacionadas