SpecialistOff.NET / Вопросы / Статьи / Фрагменты кода / Резюме / Метки / Помощь / Файлы

Список вопросов Печать

Способ организации удаления элемента из базы данных


Метки: python flask sqlalchemy json-rpc 

Ответы

RemiZOffAlex  Создано: 2018-06-27 11:19:00.967504  Обновлено: 2018-06-27 11:19:00.967504

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

Примечание: Приведён частичный код

Структура базы данных

import datetime
from sqlalchemy import Table, Column, Integer, ForeignKey, String, DateTime
from sqlalchemy.orm import relationship

from . import Base


class Note(Base):
    """
    Заметки
    """
    __tablename__ = "note"

    id = Column(Integer, primary_key=True)
    title = Column(String)
    text = Column(String, default='')
    created = Column(DateTime)
    updated = Column(DateTime)

    # Связи
    trash = relationship(
        "TrashNote",
        primaryjoin="TrashNote.note_id==Note.id",
        uselist=False
    )

    def __init__(self, title):
        self.title = title
        self.created = datetime.datetime.utcnow()
        self.updated = datetime.datetime.utcnow()


class TrashNote(Base):
    """
    Корзина для заметок
    """
    __tablename__ = "trashnote"

    id = Column(Integer, primary_key=True)
    # ID заметки
    note_id = Column(Integer, ForeignKey('note.id'))
    # Дата удаления
    created = Column(DateTime)

    # Связи
    page = relationship("Note", primaryjoin="TrashNote.note_id==Note.id")

    def __init__(self, note):
        self.note_id = note.id
        self.created = datetime.datetime.utcnow()

Вызов процедуры удаления

from . import jsonrpc
from .. import models

@jsonrpc.method('note.delete')
def note_delete(id):
    note = models.db_session.query(
        models.Note
    ).filter(
        models.Note.id==id
    ).first()
    if note is None:
        raise ValueError
    if note.trash:
        raise ValueError
    new_crumple = models.TrashNote(
        note
    )
    models.db_session.add(new_crumple)
    models.db_session.commit()
    return 'Заметка {} удалена'.format(id)

Возможно будут интересны и другие вопросы