finish working
This commit is contained in:
parent
961ddee631
commit
01b36787e1
@ -48,4 +48,7 @@
|
|||||||
|
|
||||||
- датасет comments
|
- датасет comments
|
||||||
- так как информации о связи постов комментариев не было - я создал таблицу Comment
|
- так как информации о связи постов комментариев не было - я создал таблицу Comment
|
||||||
- было упоминание "написать комментарий" в таблице логов, которую можно было дополнить столбцом, ведущим к постту, но мне кажется это не очень хорошим решением - сначала разделять на 2 БД, а потом пытаться связать данные внутри них
|
- было упоминание "написать комментарий" в таблице логов, которую можно было дополнить столбцом, ведущим к постту, но мне кажется это не очень хорошим решением - сначала разделять на 2 БД, а потом пытаться связать данные внутри них
|
||||||
|
|
||||||
|
## мои сомнения
|
||||||
|
я недопонял смыслого посыла датасета comments, поэтому тот датасет - это количество комментариев одного пользователя под пост другого с деталями
|
@ -1,5 +1,5 @@
|
|||||||
from sqlalchemy import INTEGER, ForeignKey
|
from sqlalchemy import INTEGER, ForeignKey
|
||||||
from sqlalchemy.orm import Mapped, mapped_column
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||||
|
|
||||||
from .base import Base
|
from .base import Base
|
||||||
from .user import User
|
from .user import User
|
||||||
@ -11,6 +11,6 @@ class Comment(Base):
|
|||||||
id: Mapped[int] = mapped_column(INTEGER, primary_key=True, autoincrement=True)
|
id: Mapped[int] = mapped_column(INTEGER, primary_key=True, autoincrement=True)
|
||||||
text: Mapped[str]
|
text: Mapped[str]
|
||||||
author_id: Mapped[int] = mapped_column(ForeignKey(User.id))
|
author_id: Mapped[int] = mapped_column(ForeignKey(User.id))
|
||||||
# author: Mapped[User] = relationship(lazy="selectin")
|
author: Mapped[User] = relationship(lazy="selectin")
|
||||||
post_id: Mapped[int] = mapped_column(ForeignKey(Post.id))
|
post_id: Mapped[int] = mapped_column(ForeignKey(Post.id))
|
||||||
# post: Mapped[Post] = relationship(lazy="selectin")
|
post: Mapped[Post] = relationship(lazy="selectin")
|
@ -1,5 +1,5 @@
|
|||||||
from sqlalchemy import INTEGER, ForeignKey
|
from sqlalchemy import INTEGER, ForeignKey
|
||||||
from sqlalchemy.orm import Mapped, mapped_column
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||||
|
|
||||||
from .base import Base
|
from .base import Base
|
||||||
from .user import User
|
from .user import User
|
||||||
@ -12,6 +12,9 @@ class Post(Base):
|
|||||||
header: Mapped[str]
|
header: Mapped[str]
|
||||||
text: Mapped[str] = mapped_column(default="")
|
text: Mapped[str] = mapped_column(default="")
|
||||||
author_id: Mapped[int] = mapped_column(ForeignKey(User.id))
|
author_id: Mapped[int] = mapped_column(ForeignKey(User.id))
|
||||||
# author: Mapped[User] = relationship(lazy="selectin")
|
author: Mapped[User] = relationship(lazy="selectin")
|
||||||
blog_id: Mapped[int] = mapped_column(ForeignKey(Blog.id))
|
blog_id: Mapped[int] = mapped_column(ForeignKey(Blog.id))
|
||||||
# blog: Mapped[Blog] = relationship(lazy="selectin")
|
# blog: Mapped[Blog] = relationship(lazy="selectin")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.header
|
||||||
|
@ -9,3 +9,6 @@ class User(Base):
|
|||||||
id: Mapped[int] = mapped_column(INTEGER, primary_key=True, autoincrement=True)
|
id: Mapped[int] = mapped_column(INTEGER, primary_key=True, autoincrement=True)
|
||||||
email: Mapped[str]
|
email: Mapped[str]
|
||||||
login: Mapped[str]
|
login: Mapped[str]
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.login
|
||||||
|
@ -3,17 +3,46 @@ from fastapi import APIRouter
|
|||||||
from sqlalchemy import text, func, Date, case, select
|
from sqlalchemy import text, func, Date, case, select
|
||||||
|
|
||||||
from src.adapters.database.session import async_session_maker_db1, async_session_maker_db2
|
from src.adapters.database.session import async_session_maker_db1, async_session_maker_db2
|
||||||
from src.adapters.database.models import User, Blog, Post, Log
|
from src.adapters.database.models import Log
|
||||||
|
|
||||||
|
from src.schemas.dataset_comments import DatasetCommentsItem, DatasetCommentsOutput
|
||||||
from src.schemas.dataset_general import DatasetGeneralItem, DatasetGeneralOutput
|
from src.schemas.dataset_general import DatasetGeneralItem, DatasetGeneralOutput
|
||||||
|
|
||||||
|
|
||||||
dataset_router = APIRouter()
|
dataset_router = APIRouter()
|
||||||
|
|
||||||
|
RAW_SQL_FOR_COMMENTS = """
|
||||||
|
SELECT
|
||||||
|
u_comment.login as commentator,
|
||||||
|
p."header" as post_header,
|
||||||
|
min(u_author.login) as post_owner,
|
||||||
|
(select COUNT(*) from comment co where co.post_id = p.id and co.author_id = u_comment.id) as comments_count
|
||||||
|
FROM
|
||||||
|
post p
|
||||||
|
inner JOIN "user" u_author
|
||||||
|
on (u_author.id = p.author_id)
|
||||||
|
left JOIN comment c
|
||||||
|
ON (c.post_id = p.id)
|
||||||
|
inner JOIN "user" u_comment
|
||||||
|
on (u_comment.id = c.author_id)
|
||||||
|
group by p.id, u_comment.id
|
||||||
|
;
|
||||||
|
"""
|
||||||
|
|
||||||
@dataset_router.get("/comments", response_model=None)
|
|
||||||
|
@dataset_router.get("/comments", response_model=DatasetCommentsOutput)
|
||||||
async def get_database_comments():
|
async def get_database_comments():
|
||||||
async with async_session_maker_db1() as session:
|
async with async_session_maker_db1() as session:
|
||||||
pass
|
orm_result = (await session.execute(text(RAW_SQL_FOR_COMMENTS))).all()
|
||||||
|
items = []
|
||||||
|
for record in orm_result:
|
||||||
|
items.append(DatasetCommentsItem(
|
||||||
|
commentator_login=record[0],
|
||||||
|
post_header=record[1],
|
||||||
|
post_owner=record[2],
|
||||||
|
comments_count=record[3]
|
||||||
|
))
|
||||||
|
return DatasetCommentsOutput(items=items)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
from pydantic import BaseModel, ConfigDict
|
||||||
|
|
||||||
|
|
||||||
|
class DatasetCommentsOutput(BaseModel):
|
||||||
|
model_config = ConfigDict(from_attributes=True)
|
||||||
|
|
||||||
|
items: list["DatasetCommentsItem"]
|
||||||
|
|
||||||
|
|
||||||
|
class DatasetCommentsItem(BaseModel):
|
||||||
|
model_config = ConfigDict(from_attributes=True)
|
||||||
|
|
||||||
|
commentator_login: str
|
||||||
|
post_header: str
|
||||||
|
post_owner: str
|
||||||
|
comments_count: int
|
Loading…
x
Reference in New Issue
Block a user