SQLAlchemy自定义类型包含多个列

6
我希望能够在我的模型中将数据类型表示为单个列,但实际上数据将存储在数据库的多个列中。我找不到任何关于如何在SQLAlchemy中实现这一点的好资源。
我希望我的模型看起来像这样(这是使用几何图形而不是我真正要解释的更难的问题的简化示例):
class 3DLine(DeclarativeBase):
    start_point = Column(my.custom.3DPoint)
    end_point = Column(my.custom.3DPoint)

这样一来,我就可以一次性地分配一个具有点的(x,y,z)组件的对象,而无需逐个设置它们。如果我必须分开每个组件,这可能会变得很丑陋,特别是如果每个类都有几个这样的复合对象。我将把值合并为一个编码字段,但有时需要单独查询每个值。
我能够找到如何使用单个列创建自定义类型 在文档中。但没有迹象表明我可以将单个类型映射到多个列。
我想我可以通过使用单独的表来实现这一点,每个列都将是外键,但在我的情况下,我认为每个点与单独的表之间没有一对一的映射是没有意义的,而且这仍然不能同时设置相关值。
1个回答

7
这是一个基于文档的最小示例:(来源)
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),
    )

这对于一次性使用非常好,但这种方法使得无法将其作为单独类型进行分解,在像上面这样有两个相同类型的组合字段(start_point和end_point)的情况下,会出现列名重复的情况。是否可以利用自动推断单列字段的列名,并仅将“_x”、“_y”和“_z”附加到其中?(元数据:我应该在SO上提出一个单独的问题吗?) - Veky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接