首页 > 解决方案 > 带有三个表的 Flask SQLAlchemy 外连接

问题描述

我正在尝试使用 SQLAlchemy 中的outerjoin()来连接三个表,但是当我尝试查询时,我认为它应该可以正常工作,它会引发以下错误:

1054, "Unknown column 'articles.id' in 'on clause'"

我确信它可以通过使用 ORM 引用以更简单的方式完成,但目前我正试图弄清楚如何在没有它的情况下完成这项工作。

下面是表格和查询。我还从 SQLAlchemy导入and_

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True, nullable=False)


class Articles(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    article_name = db.Column(db.String(100), unique=True, nullable=False)


class ReadArticles(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    article_id = db.Column(db.Integer, db.ForeignKey('articles.id'), nullable=False)

和查询:

r = db.session.query(Articles, User, ReadArticles).outerjoin(ReadArticles,
and_(User.id == ReadArticles.user_id, Articles.id == ReadArticles.article_id)).all()

有没有人遇到过这个问题或者可以指出我如何看到我做错了什么?

谢谢!

标签: pythonsqlalchemyflask-sqlalchemy

解决方案


希望这将有助于将来遇到类似问题的人。

我在没有and_的情况下尝试了它,并稍微修改了查询,这是可行的,左/外部正确连接了所有三个表:

q = db.session.query(Articles, User, ReadArticles).filter(User.id == 1).outerjoin(ReadArticles, ReadArticles.article_id == Articles.id).all()

为了使其更具可读性:

q = db.session.query(Articles, User, ReadArticles)
q = q.filter(User.id == 1).outerjoin(ReadArticles,
     ReadArticles.article_id == Articles.id).all()

这将在我上面概述的 ORM 类中的所有三个表中执行正确的左/外连接(至少使用 MySQL DB)。


推荐阅读