如何使用 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。
我有一个非常简单的多对多 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。