Использование Flask не может удалить регистр из таблицы в отношении «многие к одному» (невозможно удалить со многих стор ⇐ Python
Использование Flask не может удалить регистр из таблицы в отношении «многие к одному» (невозможно удалить со многих стор
класс UserModel(db.Model): __tablename__ = 'пользователи' id = db.Column(db.BigInteger,primary_key=True, nullable=False) имя = db.Column(db.String(255), nullable=True) электронная почта = db.Column(db.String(255), nullable=True) пароль = db.Column(db.String(512), nullable=True) созданный_at = db.Column(db.TIMESTAMP, nullable=False) update_at = db.Column(db.TIMESTAMP, nullable=False) tokens = db.relationship('TokenModel', backref='user', lazy=True, cascade='all, delete-orphan') # datasets = db.relationship('DatasetModel', backref='user', lazy=True, cascade='all, delete-orphan') ml_models = db.relationship('MlModelModel', backref='user', lazy=True, cascade='all, delete-orphan') ml_model_computations = db.relationship('MlModelComputationModel', backref='user', lazy=True, cascade='all, delete-orphan') класс DatasetModel(db.Model): __tablename__ = 'наборы данных' __table_args__ = {'extend_existing': True} id = db.Column(db.BigInteger, Primary_key=True) имя = db.Column(db.String(255), nullable=False) описание = db.Column(db.Text) origin_link = db.Column(db.Text) min_row = db.Column(db.Integer) max_row = db.Column(db.Integer) min_column = db.Column(db.Integer) max_column = db.Column(db.Integer) метки = db.Column(db.JSON) # is_anonymized = db.Column(db.Boolean, default=False) анонимные_метки = db.Column(db.JSON, nullable=False) image_length = db.Column(db.Integer, по умолчанию = 1000) image_height = db.Column(db.Integer, по умолчанию = 11) статус = db.Column(db.Integer, nullable=False) созданный_at = db.Column(db.TIMESTAMP, nullable=False) update_at = db.Column(db.TIMESTAMP, nullable=False) medias = db.relationship('MediaModel', backref='dataset', lazy=True, cascade='all, delete-orphan') ml_models = db.relationship('MlModelModel', backref='dataset', lazy=True, cascade='all, delete-orphan') ml_model_computations = db.relationship('MlModelComputationModel', backref='dataset', lazy=True, cascade='all, delete-orphan') user_id = db.Column(db.BigInteger, db.ForeignKey('users.id'), nullable=False) user = db.relationship('UserModel', backref='datasets', lazy=True) def delete(self, dataset_id): пользователь = UserModel.get_by_id(get_jwt()["sub"]) если пользователь: набор данных = DatasetModel.query.get_or_404(dataset_id) если dataset.user_id != user.id: return jsonify({"message": "Неверный пользователь."}), 401 поднятое_исключение = Ложь пытаться: db.session.execute("УДАЛЕНИЕ ИЗ наборов данных WHERE id =:id", {"id": dataset.id}) # db.session.delete(набор данных) db.session.commit() кроме SQLAlchemyError как e: db.session.rollback() поднятое_исключение = Истина окончательно: если поднятое_исключение: return jsonify({"message": "При удалении набора данных произошла ошибка."}), 500 еще: если FILE_HELPER.directory_exists(DATASETS_DATA_STORAGE + "/" + str(dataset.id)): поднятое_исключение = Ложь пытаться: FILE_HELPER.remove_directory(DATASETS_DATA_STORAGE + "/" + str(dataset.id)) кроме FileExistsError как e: поднятое_исключение = Истина окончательно: return {"message": "Набор данных удален."}, 200 еще: return {"message": "Набор данных удален, но каталог не найден."}, 200 В качестве последней попытки удалить строку из таблицы наборов данных я пытаюсь выполнить SQL-запрос непосредственно к базе данных, но без положительных результатов (удаление строки). Я получил SQLALCHEMY_ECHO как true, поэтому результат следующий:
веб-1 | 2024-02-29 16:32:41,588 ИНФОРМАЦИЯ sqlalchemy.engine.Engine ВЫБЕРИТЕ пользователей.id КАК идентификатор_пользователя, пользователи.имя КАК имя_пользователя, пользователи.электронная почта КАК электронная почта_пользователя, пользователи.пароль КАК пароль_пользователя, пользователи.созданные_ат КАК пользователи_созданные_ат, пользователи.обновленные_ат ASusers_updated_at веб-1 | ОТ пользователей веб-1 | ГДЕ пользователи.id = %s веб-1 | ОГРАНИЧЕНИЕ %s веб-1 | 2024-02-29 16:32:41,589 ИНФОРМАЦИЯ sqlalchemy.engine.Engine [сгенерировано за 0,00144 с] (1, 1) веб-1 | 2024-02-29 16:32:41,603 INFO sqlalchemy.engine.Engine SELECT datasets.id AS datasets_id, datasets.name AS datasets_name, datasets.description AS datasets_description, datasets.origin_link AS datasets_origin_link, datasets.min_row AS datasets_min_row, datasets.max_row AS datasets_max_row, datasets.min_column AS datasets_min_column, datasets.max_column AS datasets_max_column, datasets.labels AS datasets_labels, datasets.anonymous_labels AS datasets_anonymous_labels, datasets.image_length AS datasets_image_length, datasets.image_height AS datasets_image_height, data set.status AS datasets_status, datasets.created_at AS datasets_created_at , datasets.updated_at AS datasets_updated_at, datasets.user_id AS datasets_user_id веб-1 | ИЗ наборов данных веб-1 | ГДЕ datasets.id = %s веб-1 | 2024-02-29 16:32:41,605 ИНФО sqlalchemy.engine.Engine [сгенерировано за 0,00152 с] (1,) веб-1 | 2024-02-29 16:32:41,610 ИНФОРМАЦИЯ sqlalchemy.engine.Engine ОТКАТ веб-1 | 172.18.0.1 - - [29 февраля 2024:16:32:41 +0000] 'DELETE /datasets/1 HTTP/1.1' 200 55 '-' 'insomnia/8.6.0' за 132702 мкс
Похоже, что запрос на удаление из базы данных никогда не выполнялся, но, очевидно, команда ROLLBACK выполнялась. Я хочу удалить набор данных, используя его собственную модель или идентификатор, но не могу получить никакой помощи.
класс UserModel(db.Model): __tablename__ = 'пользователи' id = db.Column(db.BigInteger,primary_key=True, nullable=False) имя = db.Column(db.String(255), nullable=True) электронная почта = db.Column(db.String(255), nullable=True) пароль = db.Column(db.String(512), nullable=True) созданный_at = db.Column(db.TIMESTAMP, nullable=False) update_at = db.Column(db.TIMESTAMP, nullable=False) tokens = db.relationship('TokenModel', backref='user', lazy=True, cascade='all, delete-orphan') # datasets = db.relationship('DatasetModel', backref='user', lazy=True, cascade='all, delete-orphan') ml_models = db.relationship('MlModelModel', backref='user', lazy=True, cascade='all, delete-orphan') ml_model_computations = db.relationship('MlModelComputationModel', backref='user', lazy=True, cascade='all, delete-orphan') класс DatasetModel(db.Model): __tablename__ = 'наборы данных' __table_args__ = {'extend_existing': True} id = db.Column(db.BigInteger, Primary_key=True) имя = db.Column(db.String(255), nullable=False) описание = db.Column(db.Text) origin_link = db.Column(db.Text) min_row = db.Column(db.Integer) max_row = db.Column(db.Integer) min_column = db.Column(db.Integer) max_column = db.Column(db.Integer) метки = db.Column(db.JSON) # is_anonymized = db.Column(db.Boolean, default=False) анонимные_метки = db.Column(db.JSON, nullable=False) image_length = db.Column(db.Integer, по умолчанию = 1000) image_height = db.Column(db.Integer, по умолчанию = 11) статус = db.Column(db.Integer, nullable=False) созданный_at = db.Column(db.TIMESTAMP, nullable=False) update_at = db.Column(db.TIMESTAMP, nullable=False) medias = db.relationship('MediaModel', backref='dataset', lazy=True, cascade='all, delete-orphan') ml_models = db.relationship('MlModelModel', backref='dataset', lazy=True, cascade='all, delete-orphan') ml_model_computations = db.relationship('MlModelComputationModel', backref='dataset', lazy=True, cascade='all, delete-orphan') user_id = db.Column(db.BigInteger, db.ForeignKey('users.id'), nullable=False) user = db.relationship('UserModel', backref='datasets', lazy=True) def delete(self, dataset_id): пользователь = UserModel.get_by_id(get_jwt()["sub"]) если пользователь: набор данных = DatasetModel.query.get_or_404(dataset_id) если dataset.user_id != user.id: return jsonify({"message": "Неверный пользователь."}), 401 поднятое_исключение = Ложь пытаться: db.session.execute("УДАЛЕНИЕ ИЗ наборов данных WHERE id =:id", {"id": dataset.id}) # db.session.delete(набор данных) db.session.commit() кроме SQLAlchemyError как e: db.session.rollback() поднятое_исключение = Истина окончательно: если поднятое_исключение: return jsonify({"message": "При удалении набора данных произошла ошибка."}), 500 еще: если FILE_HELPER.directory_exists(DATASETS_DATA_STORAGE + "/" + str(dataset.id)): поднятое_исключение = Ложь пытаться: FILE_HELPER.remove_directory(DATASETS_DATA_STORAGE + "/" + str(dataset.id)) кроме FileExistsError как e: поднятое_исключение = Истина окончательно: return {"message": "Набор данных удален."}, 200 еще: return {"message": "Набор данных удален, но каталог не найден."}, 200 В качестве последней попытки удалить строку из таблицы наборов данных я пытаюсь выполнить SQL-запрос непосредственно к базе данных, но без положительных результатов (удаление строки). Я получил SQLALCHEMY_ECHO как true, поэтому результат следующий:
веб-1 | 2024-02-29 16:32:41,588 ИНФОРМАЦИЯ sqlalchemy.engine.Engine ВЫБЕРИТЕ пользователей.id КАК идентификатор_пользователя, пользователи.имя КАК имя_пользователя, пользователи.электронная почта КАК электронная почта_пользователя, пользователи.пароль КАК пароль_пользователя, пользователи.созданные_ат КАК пользователи_созданные_ат, пользователи.обновленные_ат ASusers_updated_at веб-1 | ОТ пользователей веб-1 | ГДЕ пользователи.id = %s веб-1 | ОГРАНИЧЕНИЕ %s веб-1 | 2024-02-29 16:32:41,589 ИНФОРМАЦИЯ sqlalchemy.engine.Engine [сгенерировано за 0,00144 с] (1, 1) веб-1 | 2024-02-29 16:32:41,603 INFO sqlalchemy.engine.Engine SELECT datasets.id AS datasets_id, datasets.name AS datasets_name, datasets.description AS datasets_description, datasets.origin_link AS datasets_origin_link, datasets.min_row AS datasets_min_row, datasets.max_row AS datasets_max_row, datasets.min_column AS datasets_min_column, datasets.max_column AS datasets_max_column, datasets.labels AS datasets_labels, datasets.anonymous_labels AS datasets_anonymous_labels, datasets.image_length AS datasets_image_length, datasets.image_height AS datasets_image_height, data set.status AS datasets_status, datasets.created_at AS datasets_created_at , datasets.updated_at AS datasets_updated_at, datasets.user_id AS datasets_user_id веб-1 | ИЗ наборов данных веб-1 | ГДЕ datasets.id = %s веб-1 | 2024-02-29 16:32:41,605 ИНФО sqlalchemy.engine.Engine [сгенерировано за 0,00152 с] (1,) веб-1 | 2024-02-29 16:32:41,610 ИНФОРМАЦИЯ sqlalchemy.engine.Engine ОТКАТ веб-1 | 172.18.0.1 - - [29 февраля 2024:16:32:41 +0000] 'DELETE /datasets/1 HTTP/1.1' 200 55 '-' 'insomnia/8.6.0' за 132702 мкс
Похоже, что запрос на удаление из базы данных никогда не выполнялся, но, очевидно, команда ROLLBACK выполнялась. Я хочу удалить набор данных, используя его собственную модель или идентификатор, но не могу получить никакой помощи.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение