Как удалить только одну строку в sql-alchemy, не удаляя ни одной из ее связей

#flask #sqlalchemy #flask-sqlalchemy

#flask #sqlalchemy #flask-sqlalchemy

Вопрос:

У меня проблемы с правилами зависимости. Хоть убей, я не могу понять, как удалить только одну строку, не удаляя ее отношений.

Таблицы:

 User
 -id
 -name
Article
  -id
  -title
UserArticle
  -id
  -user_id
  -article_id
 

В зависимости от моих каскадных правил, выполнение этого либо удаляет пользователя и статью, связанную с ним, либо просто выдает ошибку AssertionError.

 ua = UserArticle.query.first()
db.session.delete(ua)
db.session.commit()
 

Вот одна из связей.

 class UserArticle(db.Model):
  user = relationship("User",
  primaryjoin="UserArticle.user_id==User.id",
  foreign_keys="User.id")
 

Да, я прочитал правила casecade, нет, я их не понимаю. http://docs.sqlalchemy.org/en/latest/orm/session.html#cascades

Как я могу просто удалить эту запись и ничего больше?

Ответ №1:

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

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

Попробуйте определить свою модель с помощью…

 class UserArticle(db.Model):
    id = db.Column(db.Integer, primary_key=True, auto_increment=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    article_id = db.Column(db.Integer, db.ForeignKey('articles.id'))

    creator = db.relationship("User", backref="UserArticle", primaryjoin=(user == User.id))
 

Я предполагаю, что в этом коде ваши пользователи и статьи сопоставляются с таблицами «пользователи» и «статьи» соответственно.

Комментарии:

1. Эй, это сработало. Спасибо, мой друг. Я искал не в том месте.