Flask и SqlAlchemy, как удалить записи из таблицы ManyToMany?

У меня возникают проблемы с удалением записей из таблицы PostTag, содержащей столбец Post и Tag. Это моя таблица отношений:

tags = db.Table('PostTag', db.Column('Tag', db.Integer, db.ForeignKey('Tag.Id')), db.Column('Post', db.Integer, db.ForeignKey('Post.Id')) ) 

а также

 tags = db.relationship(Tag, secondary=tags, backref=db.backref('Post', lazy='dynamic')) 

Когда я это делаю:

 from models.Post import Post posts = Post.query.join(Post.tags).filter(Post.Id == id).all() if(posts): return posts return False 

а потом

 for posttag in post[0].tags: db.session.delete(posttag) db.session.flush() 

Строки из отношения ManyToMany удаляются, а также записи из таблицы Tag.

Мне просто нужно удалить записи из таблицы PostTag для некоторого условия (например, Post = 1)

Я искал интернет, но я не нашел ничего убедительного. Мне не нужен каскад в отношении ManyToMany.

Это sql log:

  297 Query DELETE FROM `PostTag` WHERE `PostTag`.`Tag` = 14 AND `PostTag`.`Post` = 3 297 Query DELETE FROM `PostTag` WHERE `PostTag`.`Tag` = 14 AND `PostTag`.`Post` = 18 297 Query DELETE FROM `Tag` WHERE `Tag`.`Id` = 14 

Последняя строка 297 Query DELETE FROM Tag WHERE Tag . Id = 14 не должно быть.

ОБНОВЛЕНИЕ / возможно решение

Я как бы решу это:

 sql = 'DELETE FROM PostTag WHERE Post=%s' db.engine.execute(sql, post, ()) 

но это не просто путь ORM. То же самое касается вставки. Я попытаюсь получить этот разрешенный путь ORM. Я отправлю ответ, если я уберу эту проблему.

2 Solutions collect form web for “Flask и SqlAlchemy, как удалить записи из таблицы ManyToMany?”

Попробуй это:

 post = db.session.query(Post).get(1) post.tags = [] db.session.commit() 

Здесь мы переопределяем коллекцию post.tags в пустой массив и post.tags изменения. Чтобы объяснить это, я буду ссылаться на документы SQLAlchemy :

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

Поэтому SQLAlchemy отслеживает изменения, которые мы вносим в коллекцию post.tags, и обновляем ее при фиксации.

Если бы у нас был только один тег (например, sometag ), мы могли бы использовать метод remove следующим образом:

 post = db.session.query(Post).get(1) post.tags.remove(sometag) db.session.commit() 

Попробуйте удалить объекты из коллекции:

 post[0].tags.clear() 

Вы также можете удалить отдельные элементы:

 post[0].tags.remove(posttag) 
  • Автоматически распространяющее удаление при использовании двунаправленной ассоциации_proxy
  • Можно ли выгрузить декларативные классы в SQLAlchemy?
  • Какова ваша папка для приложения Flask, разделенная на модули?
  • Легко конвертировать между столбцами SQLAlchemy и типами данных?
  • SQLAlchemy - сопоставление самореферентных отношений как одного для многих (декларативная форма)
  • Как трехсторонние отношения «многие-ко-многим» в колбе-sqlalchemy
  • Повесьте скрипт Python с помощью SQLAlchemy и многопроцессорности
  • SQLAlchemy Соединение с проблемой подзапроса
  • SQLAlchemy - самореляционное отношение Many-to-many с дополнительным столбцом
  • Ошибка импорта моделей при попытке запустить приложение
  • SQLAlchemy связывание ассоциации прокси для правнуков?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.