Dictionary of tags in declarative SQLAlchemy?
我正在处理使用
声明性只是定义事物的另一种方式。实际上,与使用单独的映射相比,最终得到的环境完全相同。
既然我回答了另一个问题,我也试试这个。希望它能给予更多的赞成票;)
首先我们定义类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | from sqlalchemy import Column, Integer, String, Table, create_engine from sqlalchemy import orm, MetaData, Column, ForeignKey from sqlalchemy.orm import relation, mapper, sessionmaker from sqlalchemy.orm.collections import column_mapped_collection from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.ext.declarative import declarative_base engine = create_engine('sqlite:///:memory:', echo=True) Base = declarative_base(bind=engine) class Note(Base): __tablename__ = 'notes' id_item = Column(Integer, ForeignKey('items.id'), primary_key=True) name = Column(String(20), primary_key=True) value = Column(String(100)) def __init__(self, name, value): self.name = name self.value = value class Item(Base): __tablename__ = 'items' id = Column(Integer, primary_key=True) name = Column(String(20)) description = Column(String(100)) _notesdict = relation(Note, collection_class=column_mapped_collection(Note.name)) notes = association_proxy('_notesdict', 'value', creator=Note) def __init__(self, name, description=''): self.name = name self.description = description Base.metadata.create_all() |
现在让我们做一个测试:
1 2 3 4 5 6 7 8 9 10 11 | Session = sessionmaker(bind=engine) s = Session() i = Item('ball', 'A round full ball') i.notes['color'] = 'orange' i.notes['size'] = 'big' i.notes['data'] = 'none' s.add(i) s.commit() print i.notes |
号
我得到:
1 | {u'color': u'orange', u'data': u'none', u'size': u'big'} |
现在让我们检查一下笔记表…
1 2 | for note in s.query(Note): print note.id_item, note.name, note.value |
。
我得到:
1 2 3 | 1 color orange 1 data none 1 size big |
它起作用了!!D