python – 如何使用SQLAlchemy映射一个类与多个表?

前端之家收集整理的这篇文章主要介绍了python – 如何使用SQLAlchemy映射一个类与多个表?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
让我们说,我有一个数据库结构,有三个表,如下所示:
items
 - item_id
 - item_handle

attributes
 - attribute_id
 - attribute_name

item_attributes
 - item_attribute_id
 - item_id
 - attribute_id
 - attribute_value

我希望能够在sqlAlchemy中做到这一点:

item = Item('item1')
item.foo = 'bar'

session.add(item)
session.commit()

item1 = session.query(Item).filter_by(handle='item1').one()
print item1.foo # => 'bar'

我是sqlAlchemy的新手,我在文档(http://www.sqlalchemy.org/docs/05/mappers.html#mapping-a-class-against-multiple-tables)中发现了这一点:

j = join(items,item_attributes,items.c.item_id == item_attributes.c.item_id). \
    join(attributes,item_attributes.c.attribute_id == attributes.c.attribute_id)

mapper(Item,j,properties={
    'item_id': [items.c.item_id,item_attributes.c.item_id],'attribute_id': [item_attributes.c.attribute_id,attributes.c.attribute_id],})

它只将item_id和attribute_id添加到Item,并且不可能向Item对象添加属性.

我正试图用sqlAlchemy实现可能吗?有没有更好的方式来构建数据库以获得与“动态列”相同的行为?

解决方法

这被称为 entity-attribute-value模式.在sqlAlchemy示例目录下有一个例子: vertical/.

如果您使用Postgresql,那么还有一个可以存储字符串到字符串映射的hstore contrib模块.如果您有兴趣,那么我有一些自定义类型的代码,可以通过sqlAlchemy使用它来存储扩展属性.

存储自定义属性的另一个选项是将它们序列化为文本字段.在这种情况下,您将失去通过属性过滤的能力.

猜你在找的Python相关文章