【问题标题】:SQLAlchemy Custom Type Which Contains Multiple Columns包含多列的 SQLAlchemy 自定义类型
【发布时间】:2010-12-31 12:14:19
【问题描述】:

我想在我的模型中将数据类型表示为单个列,但实际上数据将存储在数据库的多个列中。我在 SQLAlchemy 中找不到任何好的资源。

我希望我的模型看起来像这样(这是一个使用几何的简化示例,而不是我更难解释的实际问题):

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

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

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

我想我可以通过使用单独的表来完成此操作,并且每一列都是一个外键,但在我的情况下,我认为将每个点都映射到单独的表是没有意义的,这仍然不能一次性设置相关值。

【问题讨论】:

    标签: orm model sqlalchemy


    【解决方案1】:

    这是一个基于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),
        )
    

    【讨论】:

    • 这非常适合一次性使用,但是这种方法无法将其分解为单独的类型,在上述情况下,当有两个相同类型的复合字段(start_point 和end_point) - 会有重复的列名。是否可以利用适用于单列字段的列名的自动推断,只需将“_x”、“_y”和“_z”附加到它上面? (元:我应该就此问一个单独的问题吗?)
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多