您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – SQLAlchemy删除关联对象

5b51 2022/1/14 8:20:38 python 字数 4598 阅读 482 来源 www.jb51.cc/python

我试图通过过滤其中一个关系中的列来批量删除关联表中的对象.我在SQLAlchemy中使用以下调用来进行删除db.session.query(UserPaper).join(Paper, (UserPaper.paper_id == Paper.id)).filter(UserPaper.user_id == user.id).filter(Paper.jou

概述

我试图通过过滤其中一个关系中的列来批量删除关联表中的对象.我在sqlAlchemy中使用以下调用来进行删除

db.session.query(UserPaper).join(Paper,(UserPaper.paper_id ==
Paper.id)).filter(UserPaper.user_id == user.id).filter(Paper.journal_id 
== journal.id).delete()

并导致以下错误

OperationalError: (OperationalError) (1054,"UnkNown column 'papers.journal_id' 
in 'where clause'") 'DELETE FROM userpapers WHERE userpapers.user_id = %s AND
papers.journal_id = %s' (1L,1L)

如果没有最后的删除,sqlAlchemy查询就是

SELECT userpapers.user_id AS userpapers_user_id,userpapers.paper_id AS 
userpapers_paper_id,userpapers.created AS userpapers_created,userpapers.read_at AS userpapers_read_at,userpapers.score AS userpapers_score
FROM userpapers JOIN papers ON userpapers.paper_id = papers.id
WHERE userpapers.user_id = :user_id_1 AND papers.journal_id = :journal_id_1

哪个是对的.从错误中我可以看到,当我将delete()附加到查询时,sql语句的连接部分会丢失,数据库显然不知道如何查找papers.journal_id列.我不明白为什么会发生这种情况?

这是我的ORM对象的设置

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

    id = db.Column(db.Integer,primary_key=True)
    email = db.Column(db.String(255),unique=True)
    papers = db.relationship("UserPaper",backref=db.backref('users'),lazy='dynamic')

class Paper(db.Model):
    __tablename__ = 'papers'

    id = db.Column(db.Integer,primary_key = True)
    title = db.Column(db.String(1024))
    journal_id = db.Column(db.Integer,db.ForeignKey('journals.id'))

class UserPaper(db.Model):
    __tablename__ = 'userpapers'

    user_id = db.Column(db.Integer,db.ForeignKey('users.id'),primary_key=True)
    paper_id = db.Column(db.Integer,db.ForeignKey('papers.id'),primary_key=True)
    paper = db.relationship("Paper",backref=db.backref('user_paper'))
    read_at = db.Column(db.DateTime)
    score = db.Column(db.Integer)

class Journal(db.Model):
    __tablename__ = 'journals'

    id = db.Column(db.Integer,primary_key = True)
    title = db.Column(db.String(100),index = True,unique = True)
    papers = db.relationship('Paper',backref = 'journal',lazy = 'dynamic')

    paperQuery = db.session.query(Paper.id)\
                                    filter(Paper.journal_id == journal.id)


    baseQuery  = db.session.query(UserPaper)\
                                    .filter(UserPaper.paper_id.in_(paperQuery.subquery()))
                                    .filter(UserPaper.user_id == user.id).delete(synchronize_session='fetch')

它对我来说效果很好,它也应该解决你的问题.

总结

以上是编程之家为你收集整理的python – SQLAlchemy删除关联对象全部内容,希望文章能够帮你解决python – SQLAlchemy删除关联对象所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶