2009-12-31 162 views
6

我想在我的模型中将数据类型表示为单列,但实际上数据将存储在数据库的多列中。我无法找到任何有关如何在SQLAlchemy中执行此操作的好资源。SQLAlchemy自定义类型包含多列

,我想我的模型看起来像这样(这是运用几何学而不是我的真正的问题是难以解释一个简单的例子):

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

这样我可以分配与对象( x,y,z)分量,而不是单独设置它们。如果我必须分离每个组件,这可能会变得很难看,特别是如果每​​个类都有几个这样的组合对象。我会将这些值合并到一个编码字段中,但我需要分别查询每个值。

我能够找出如何使用单列in the documentation来制作自定义类型。但没有迹象表明我可以将单一类型映射到多个列。

我想我可以通过使用一个单独的表来完成此任务,并且每一列都是一个外键,但在我的情况下,我认为将每个点映射到一个单独的对象并不重要表,并且这仍然不能一次设置全部相关值。

回答

7

这里是基于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

这非常适合一次性使用,然而这种方法使得不可能因素它作为一个单独的类型,在情况下,像上述当存在是两个相同类型的复合字段(start_point和end_point) - 列名称会重复。是否可以利用对单列字段起作用的列名的自动推断,并将“_x”,“_y”和“_z”添加到它中? (元:我是否应该就此问一个单独的问题?) – Veky 2015-04-02 07:56:55

相关问题