Удаление записи flask-sqlalchemy

118
14 сентября 2021, 11:50

Сделал такие модели:

    class Editor(db.Model):
    __tablename__ = 'editors'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('users.id', ondelete='CASCADE'))
    message_id = db.Column(db.Integer(), db.ForeignKey('messages.id', ondelete='CASCADE'))
class Message(db.Model):
    __tablename__ = 'messages'
    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(404))
    tags = db.Column(db.String(100), default=0)
    date = db.Column(db.DateTime, default=datetime.now())
    creator_id = db.Column(db.Integer(), db.ForeignKey('users.id', ondelete='CASCADE'))
    editor = relationship(Editor, backref="parent", passive_deletes=True)
    @property
    def serialize(self):
        return {'id': self.id, 'text': self.text, 'tags': self.tags, 'date': self.date, 'creator_id': self.creator_id}
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    count_messages = db.Column(db.Integer, default=0)
    api_key = db.Column(db.String(32))
    message = relationship(Message, backref="parent", passive_deletes=True, cascade="all,delete")
    editor = relationship(Editor, backref="parent1", passive_deletes=True, cascade="all,delete")
    def __init__(self,*args,**kwargs):
        super(User, self).__init__(*args, **kwargs)
        self.api_key = secrets.token_urlsafe(32)
    @property
    def serialize(self):
        return {'id': self.id, 'name': self.name, 'count_messages': self.count_messages}

Когда удаляю запись из users видает такую ошибку:

sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (lab_5.editors, CONSTRAINT editors_ibfk_1 FOREIGN KEY (user_id) REFERENCES users (id))') [SQL: DELETE FROM users WHERE users.id = %(id)s] [parameters: {'id': 1}] (Background on this error at: http://sqlalche.me/e/gkpj)

Удаляю так:

db.session.delete(u)
db.session.commit()
Answer 1

Ну дык у Вас определен внешний ключ в таблице lab_5.editors на таблицу users, о чем и говорит сообщение об ошибке:

sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (lab_5.editors, CONSTRAINT editors_ibfk_1 FOREIGN KEY (user_id) REFERENCES users (id))') [SQL: DELETE FROM users WHERE users.id = %(id)s] [parameters: {'id': 1}] (Background on this error at: http://sqlalche.me/e/gkpj)

Определите в этом ключе необходимое поведение при удалении "родительских данных", используя конструкцию ON DELETE .... Иначе перед тем, как удалить пользователя из таблицы users, Вам придется вручную удалить все записи, которые на него ссылаются через внешние ключи. Я так понимаю, если пользователь удаляется и users - то он уже никак не может быть редактором и должен быть удален из editors. Вот и добавьте во внешний ключ поведение ON DELETE CASCADE.

READ ALSO
Выполнить запрос без join

Выполнить запрос без join

Есть таблица, со следующей структурой

73
Как выбрать товары с ценами с помощью WP_Query с ценами

Как выбрать товары с ценами с помощью WP_Query с ценами

Как можно выбрать товары вместе с ценами, и нужно потом вернуть результат выборки по ajax допустим в массиве, для дальнейшей обработки товаров...

145
Помогите найти ошибку в коде php

Помогите найти ошибку в коде php

Взялся помочь человеку с сайтом на Bitrix, начал редактировать файл шаблона и испортил код, сейчас сайт не открывается с ошибкой "[ParseError] syntax...

70
из двух масивов дат в один php

из двух масивов дат в один php

у меня есть два массива с датами

71