Словарь тегов в декларативном SQLAlchemy?

Некоторые дальнейшие преимущества событий.

  • Вы получаете надлежащее многоадресное поведение бесплатно.
  • при изменении подписчиков события в ответ на то событие, поведение четко определено
  • , Они могут анализироваться (отраженные) легко и последовательно
  • поддержка Набора инструментальных средств событий (просто, потому что они - идиома в .NET)
  • , Вы получаете опцию использовать асинхронную пчелу, которую это обеспечивает

, можно достигнуть всех их (кроме набора инструментальных средств) сами, но это удивительно твердо. Например: Если Вы используете членскую переменную как List<> для хранения списка наблюдателей. При использовании foreach для итерации по нему затем какой-либо попытки добавить или удалить подписчика в одном из OnFoo (), обратные вызовы метода инициируют исключение, если Вы не напишете дальнейший код для контакта с ним чисто.

6
задан Community 23 May 2017 в 10:33
поделиться

1 ответ

​​

Декларативность - это просто еще один способ определения вещей. Фактически вы получите ту же среду, что и при использовании раздельного сопоставления.

Поскольку я ответил на другой вопрос, я попробую и этот. Надеюсь, это даст больше голосов;)

Ну, сначала мы определим классы

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

13
ответ дан 8 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: