Jak zmapować jedną klasę przeciwko wielu stołom za pomocą SQLAlchemy?
Powiedzmy, że mam strukturę bazy danych z trzema tabelami, które wyglądają tak:
items
- item_id
- item_handle
attributes
- attribute_id
- attribute_name
item_attributes
- item_attribute_id
- item_id
- attribute_id
- attribute_value
Chciałbym móc to zrobić w 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'
Jestem nowym użytkownikiem SQLAlchemy i znalazłem to w dokumentacji (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],
})
Dodaje tylko Item_id i attribute_id do Item i nie można dodawać atrybutów do obiektu Item.
Czy to, co próbuję osiągnąć, jest możliwe dzięki SQLAlchemy? Czy istnieje lepszy sposób na strukturę bazy danych, aby uzyskać takie samo zachowanie „kolumn dynamicznych”?