Как правильно писать запросы в 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 шт):
Добавьте в 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 записи, по другому не бывает.