如何将关联代理与经典映射一起使用?

时间:2017-07-22 22:47:19

标签: python sql database sqlalchemy

我在互联网上阅读使用关联代理的示例,但我发现所有这些代码都是用声明式样式编写的。

我可以在经典映射中使用它们吗?原因是我将数据库持久性实现到已经存在的类层次结构中,并且我希望将与数据库相关的代码保存在单独的文件中。

举个例子,我们假设一个模型,我们有一个Item和一个Order个对象。我们与关联表中的额外字段建立多对多关系,例如,为该项目支付的价格:

item = Table('item', metadata, 
             Column('id', Integer, primary_key=True), 
             Column('name', String), 
             Column('quantity', Integer)
             )

order = Order('order', metadata,
              Column('id', Integer, primary_key=True), 
              Column('customer_id', Integer, ForeignKey('user.id'))
             )

order_item = Table('order_item', metadata,
                   Column('order_id', Integer, ForeignKey('order.id')), 
                   Column('item_id', Integer, ForeignKey('item.id')), 
                   Column('price', Float)
                  )

# Mapping of Tables to non-orm objects

我们假设我想以一种很好的方式访问用户关键字示例中解释in the docs的订单项。以声明方式将属性添加到作为关联代理的类中:

# ... Class definition ...
items = association_proxy('order_items', 'items')

如何以经典的地图样式进行此操作?

1 个答案:

答案 0 :(得分:2)

来自documentation

  

AssociationProxy生成的association_proxy()对象   function是Python descriptor的一个实例。它总是被宣布   无论是否映射用户定义的类   使用mapper()函数的声明或经典映射。

所以,只需在课程中定义它:

class Order(object):
    ...
    items = association_proxy('order_items', 'items')