2013-11-01 83 views
4

我试图通过在其中一个关系中的列上进行筛选来从关联表中批量删除对象。我使用的SQLAlchemy下面的调用,使删除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') 
+0

什么是SQLAlchemy版本?什么是SQL数据库和版本? –

+0

SQLAlchemy是0.8.2,SQL db是MySQL 5.6.12 – Jacopo

+0

我有完全相同的问题 - 你没有找到解决方案呢? – Zitrax

回答

3

我使用MySQL 5.6有同样的问题与SQLAlchemy的0.9。它看起来像一个错误/限制。然而,一个更好的方式来获得以防万一(相比于创建查询,通过成果循环,并逐个删除它们一个)是在两个后续查询执行此任务:

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') 

它的工作很适合我,它也应该解决你的问题。

+0

谢谢。我会尽快尝试,并告诉你它是否适用于我。 – Jacopo

+0

最后,我有机会尝试你的解决方案,它完美的工作。谢谢! – Jacopo

相关问题