Колба SQLAlchemy externaljoin с тремя таблицами - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь использовать outerjoin () из SQLAlchemy для объединения трех таблиц, однако, когда я пытаюсь выполнить запрос, который, по моему мнению, должен работать, выдает следующую ошибку:

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

Я уверен, что это можно сделать проще, используя ссылки ORM, но в данный момент я пытаюсь выяснить, как заставить это работать без этого.

Ниже приведены таблицы и запросы.Я также импортирую and_ из SQLAlchemy

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

Кто-нибудь сталкивался с этим или может указать мне, как посмотретьчто я делаю не так?

Спасибо!

1 Ответ

0 голосов
/ 23 мая 2018

Надеюсь, это поможет кому-то в будущем столкнуться с подобной проблемой.

Я пробовал без и_ , немного изменил запрос, и это работает, оставил /external правильно соединяет все три таблицы:

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

Это выполняет правильное левое / внешнее соединение (по крайней мере, с БД MySQL) по всейвсе три таблицы в классах ORM, которые я обрисовал выше.

...