如何解决如何使用 Flask_SQLAlchemy 从 db.Table 中删除 1 条记录?
我有一个非常简单的多对多表结构,但我在从表中删除记录以在其他两个之间建立关联时遇到问题:
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'),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)
为了更清楚,这里摘录了包含一些记录的表格:
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()
类 'sqlalchemy.engine.row.Row' 未映射
所以在对 Stack 和文档进行了一些研究之后,我尝试这样做:
db.session.execute(user_book.delete(user_id).where(bid=book_id))
db.session.commit()
在这种情况下,我收到了以下信息:
WHERE/HAVING 角色的 sql 表达式,得到 2。
我真的不知道如何解决这个问题。我只想从 user_book
表中删除 1 条记录。有人知道怎么做吗?
解决方法
鉴于要从 User
的书籍中删除的 Book
实例和 User
实例,可以像这样删除 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。