sqlalchemy запускает автоматическую вставку после удаления на другую таблицу - PullRequest
0 голосов
/ 28 апреля 2019

Я использую SQLAlchemy с python, задаваясь вопросом, можно ли автоматически вставить запись в таблицу Deleted Users, когда запись была удалена из таблицы Users.

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

Для простоты предположим, что обе таблицы имеют одинаковую схему (2 столбца; user_id и username.

Спасибо

1 Ответ

1 голос
/ 29 апреля 2019

Триггеры или «удаленный» столбец могут быть наиболее надежным способом сделать это, но если вы хотите сделать это с помощью SQLAlchemy, API события может быть подходящим способом.

from sqlalchemy import event
from sqlalchemy.sql import dml, select

def before_flush(session, flush_context, instances):
    for instance in session.deleted:
        if isinstance(instance, User):
            # insert into the deleted user table

def before_execute(conn, clauseelement, multiparams, params):
    if isinstance(clauseelement, dml.Delete):
       if clauseelement.table.name == "user":
           query = select([clauseelement.table])
           if clauseelement._whereclause is not None:
               query = query.where(clauseelement._whereclause)
           for row in conn.execute(query):
               # insert into the deleted user table

event.listen(session, "before_flush", before_flush)
event.listen(engine, "before_execute", before_execute)

Функция before_flush будет захватывать удаления ORM, тогда как before_execute захватывает общие запросы, которые удаляются из пользовательской таблицы.

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