Событие Sqlalchemy для мостовых таблиц отношений - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь отслеживать изменения в базе данных, и в настоящее время я пытаюсь сделать это с событиями картографа.Это прекрасно работает для стандартных таблиц, но, похоже, не срабатывает для таблиц-бриджей во многих отношениях.

Например, если у меня есть эти таблицы

# Main Classes
class TblContacts(BaseRelationsTable):

    __tablename__ = 'tbl_contacts'
    __relationstable__ = TblContactsContacts
    _linkingtables__ = [TblEventsContacts, TblEiplContacts]
    __friendlyname__ = "Contact"

    guid = Column(String(36), primary_key=True)
    created = Column(SubTimeStamp)
    modified = Column(SubTimeStamp)
    username = Column(SubString)
    contact_type = Column(SubString)
    name_first = Column(SubString)
    name_last = Column(SubString)
    job_title = Column(SubString)
    company = Column(SubString)
    phone = Column(SubPhone)
    email = Column(SubEmail)
    address_line1 = Column(SubString)
    address_line2 = Column(SubString)
    address_city = Column(SubString)
    address_state = Column(SubString)
    address_zip = Column(SubString)
    address_country = Column(SubString)

    relations = orm.relationship('TblContacts',
                                 secondary='tbl_contacts_contacts',
                                 primaryjoin='TblContacts.guid==TblContactsContacts.parent_id',
                                 secondaryjoin='TblContacts.guid==TblContactsContacts.child_id',
                                 )

class TblContactsContacts(BaseTable):
    __tablename__ = "tbl_contacts_contacts"
    __friendlyname__ = "TblContactsContacts"

    guid = Column(SubUUID, primary_key=True, nullable=False, default=uuid.uuid4)
    parent_id = Column(String, ForeignKey('tbl_contacts.guid'))
    child_id = Column(String, ForeignKey('tbl_contacts.guid'))

И эти сопоставители применяются к этим таблицам

def _after_insert(target):
    # Do Things
    pass

def _after_update(target):
    # Do Things
    pass

def _after_delete(target):
    # Do Things
    pass

Из-за простоты кода я предпочел бы продолжать использоватьafter_insert, update ... Но я начинаю думать, что это не сработает.

Нужно ли ловить его с before_commit?и если да, то как мне просмотреть записи в сеансе, чтобы найти вставленные и обновленные записи?

1 Ответ

0 голосов
/ 06 марта 2019

Чтобы обернуть этот вопрос, я не нашел способа сделать именно то, что я спрашивал в этом вопросе.Я попытался получить записи таблицы мостов из события фиксации сеанса, но это дает только запись родительской таблицы с атрибутами взаимосвязи, а не объект таблицы мостов.

Итак, я просто написал свои триггерные операторы и добавил их непосредственно в базу данных.Возможно, лучшее решение в конце концов, но оно добавляет другое место, которое мне нужно отредактировать, если я добавлю или вычту поля базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...