SQLAlchemy left join с использованием подзапроса

Допустим, есть таблица «posts», которая содержит записи в блогах, и другую таблицу «избранное», которая связывает имя пользователя с сообщением. Многие пользователи могут любить сообщение, поэтому отношения – это одно сообщение для многих избранных.

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

Мне нужно что-то вроде:

current_user = 'testuser' posts.query.outerjoin(favorites, and_(posts.post_id == favorites.post_id, favorites.username == current_user)).limit(10).all() 

Это меня очень близко, но, похоже, состояние «favorite.username == current_user» в основном игнорируется. Это то, что я ищу в реальном SQL:

 SELECT * FROM posts p LEFT JOIN ( SELECT * FROM favorites f WHERE f.user_id = 'testuser' ) ff ON ff.post_id = p.post_id LIMIT 10 

Также стоит упомянуть, что я определил отношения на должностях, таких как:

 favorites = db.relationship("favorites") 

И я определил внешний ключ в таких фаворитах:

 post_id = db.Column(db.String(255), db.ForeignKey('posts.post_id')) 

Как это сделать в SQLAlchemy?

На самом деле вам просто нужно заменить outerjoin на join , и фильтр будет работать нормально.

Кроме того, если ваша таблица favorites не содержит дополнительной информации и только связывает users и posts , вы должны просто определить отношения «Многие для многих» . В примерах документации Parent / Child будет вашим пользователем / сообщением.

Обновление-1: просто чтобы ответить на вторую часть вопроса с учетом вашего комментария, запрос ниже должен дать вам представление:

 current_user = 2 subq = (db.session.query(favorites) .filter(favorites.user_id == current_user).subquery('ff')) q = (db.session.query(posts, subq.c.score) .outerjoin(subq, subq.c.post_id == posts.post_id)) q = q.order_by(subq.c.score.desc()) for post, score in q: print(post, score)