Как правильно писать запросы в Postgresql, если мы имее несколько ссылок(у которых одинаковый Id) из дочернего объекта на основной?

Приведу примеры моделей

class News(Base):
    __tablename__ = 'news_table'
    id = Column(Integer, primary_key=True, index=True)
    head = Column(String)
    body = Column(String(350))
    date = Column(DateTime(timezone=True), server_default=sql.func.now())
    news = News.__table__

class Comment(Base):
    __tablename__ = 'comments_table'
    id = Column(Integer, primary_key=True, index=True)
    body_c = Column(String)
    news = relationship("News", backref='comments')
    news_id = Column(Integer, ForeignKey('news_table.id', 
        ondelete="CASCADE"))

    comment = Comment.__table__

Мне необходимо получить все новости с их комментариями, при запросе вида:

SELECT * FROM comments_table INNER JOIN news_table 
ON news_table.id = comments_table.news_id;

Я получаю результат вида:

id |  head  |  body  |             date              | id | body_c | news_id 
----+--------+--------+-------------------------------+----+--------+---------
 1 | string | string | 2021-03-23 10:47:11.573694+07 |  1 | string |       1
 1 | string | string | 2021-03-23 10:47:11.573694+07 |  2 | funcq  |       1
(2 строки)

Хотя ожидаю только 1 новость и 2 комментария, а не вывод двух одинаковых объектов соответственно. Понимаю, что проблема с запросом, но не понимаю куда копать. Если укажете на ошибки буду очень признателен.


Ответы (1 шт):

Автор решения: Andrew Holovko

Добавьте в news атрибут comments = relationship("Comment"), это позволит после создания записи доставать комментарии по полю новостей. Вот так: News.comments.

Доставать новости можно через sqlalchemy orm, вот так:

>>> news = session.query(models.News).first()
>>> print(news.comments)
[<models.Comment object at 0x1062f6b20>, <models.Comment object at 0x1062f6c10>]

Мне необходимо получить все новости с их комментариями, при запросе вида:SELECT * FROM comments_table INNER JOIN news_table ON news_table.id = comments_table.news_id; Я получаю результат вида:

Ваш запрос вернёт 2 строки, тк вторая таблица содержит 2 записи, по другому не бывает.

→ Ссылка