如何使用 Flask_SQLAlchemy 从 db.Table 中删除 1 条记录?

How to remove 1 record from a db.Table using Flask_SQLAlchemy?

我有一个非常简单的多对多 table 结构,我在从 table 中删除记录时遇到问题,这使得其他两个之间存在关联:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

user_book = db.Table('user_book',
                     db.Column('uid', db.Integer, db.ForeignKey('user.uid'), primary_key=True),
                     db.Column('bid', db.Text, db.ForeignKey('book.bid'), primary_key=True),
                     db.Column('date_added', db.DateTime(timezone=True), server_default=db.func.now())
                     )


class User(db.Model):
    __tablename__ = 'user'

    uid = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(25), nullable=False)
    hash = db.Column(db.String(), nullable=False)
    first_name = db.Column(db.String(30), nullable=True)
    last_name = db.Column(db.String(80), nullable=True)
    books = db.relationship('Book', secondary=user_book)

class Book(db.Model):
    __tablename__ = 'book'

    bid = db.Column(db.Text, primary_key=True)
    title = db.Column(db.Text, nullable=False)
    authors = db.Column(db.Text, nullable=False)
    thumbnail = db.Column(db.Text, nullable=True)
    users = db.relationship('User', secondary=user_book)

为了更清楚,这里摘​​录自 table 的一些记录:

在删除记录的函数中我是这样操作的:

def remove(book_id):
    # get the user id (uid)
    user_id = db.session.query(User).filter_by(email=session['email']).first().uid

    # match the user id with the book id on table 'user_book'
    book_rm = db.session.query(user_book).filter_by(uid=user_id, bid=book_id).one()

    db.session.delete(book_rm)
    db.session.commit()

当我调用此函数时,控制台出现以下错误:

Class 'sqlalchemy.engine.row.Row' is not mapped

所以在对 Stack 和文档进行了一些研究之后,我尝试这样做:

db.session.execute(user_book.delete(user_id).where(bid=book_id))
db.session.commit()

在这种情况下,我收到了以下信息:

SQL expression for WHERE/HAVING role expected, got 2.

我真的不知道如何解决这个问题。我只想从 user_book table 中删除 1 条记录。有人知道怎么做吗?

鉴于要从 User 的书中删除 User 实例和 Book 实例,可以像这样删除 Book

user_instance.books.remove(book_instance)
db.session.commit()

所以 remove 函数看起来像这样:

def remove(book_id):
    # get the user
    user = db.session.query(User).filter_by(email=session['email']).first()

    # Find the book by its id
    book_rm = Book.query.get(book_id)

    user.books.remove(book_rm)
    db.session.commit()

有关详细信息,请参阅 SQLAlchemy docs