代码之家  ›  专栏  ›  技术社区  ›  Martin Blech

声明性SQLAlchemy中的标记字典?

  •  6
  • Martin Blech  · 技术社区  · 15 年前

    我正在处理一个相当大的代码库,它是用 sqlalchemy.ext.declarative ,我需要向其中一个类添加类似dict的属性。我需要的和里面的一样 this question 但以声明的方式。有人能给我举个例子吗? 事先谢谢…

    1 回复  |  直到 15 年前
        1
  •  13
  •   nosklo    15 年前

    声明性只是定义事物的另一种方式。实际上,与使用单独的映射相比,最终得到的环境完全相同。

    既然我回答了另一个问题,我也要试试这个。希望它能给予更多的赞成票;)

    首先我们定义类

    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()
    

    现在让我们做一个测试:

    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
    

    我得到:

    {u'color': u'orange', u'data': u'none', u'size': u'big'}
    

    现在让我们检查一下笔记表…

    for note in s.query(Note):
        print note.id_item, note.name, note.value
    

    我得到:

    1 color orange
    1 data none
    1 size big
    

    它起作用了!!D