Update database architecture. Add genres and actors

This commit is contained in:
2024-06-23 19:42:40 +04:00
parent 7b2f270913
commit fc3bcc343d
18 changed files with 220 additions and 12 deletions

View File

@@ -1,6 +1,7 @@
from time import strftime from time import strftime
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from sqlalchemy.orm import selectinload
from .. import models as mdl from .. import models as mdl
from .. import schemas as sch from .. import schemas as sch

View File

@@ -1,4 +1,11 @@
from .games import Game as Game from .games import Game as Game
from .game_genres import GameGenre as GameGenre
from .movies import Movie as Movie from .movies import Movie as Movie
from .movie_genres import MovieGenre as MovieGenre
from .movie_actors import MovieActor as MovieActor
from .audiobooks import Audiobook as Audiobook from .audiobooks import Audiobook as Audiobook
from .audiobook_genres import AudiobookGenre as AudiobookGenre
from .users import User as User from .users import User as User

View File

@@ -0,0 +1,25 @@
from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String
from sqlalchemy.orm import relationship
from ..database import Base
class AudiobookGenre(Base):
__tablename__ = "audiobook_genres"
id = Column(Integer, primary_key=True)
genre = Column(String, nullable=False, unique=True)
audiobooks = relationship("Audiobook", secondary="audiobook_to_genre",
lazy="selectin")
class AudiobookToGenre(Base):
__tablename__ = "audiobook_to_genre"
__table_args__ = (
PrimaryKeyConstraint("audiobook_id", "genre_id"),
)
audiobook_id = Column(Integer, ForeignKey("audiobooks.id"), nullable=False)
genre_id = Column(Integer, ForeignKey(
"audiobook_genres.id"), nullable=False)

View File

@@ -1,4 +1,5 @@
from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from ..database import Base from ..database import Base
@@ -14,7 +15,6 @@ class Audiobook(Base):
author = Column(String) author = Column(String)
torrent_file = Column(String, nullable=False) torrent_file = Column(String, nullable=False)
upload_date = Column(String, nullable=False)
fragment = Column(String) fragment = Column(String)
update_date = Column(String, nullable=False) update_date = Column(String, nullable=False)
language = Column(String) language = Column(String)
@@ -23,4 +23,7 @@ class Audiobook(Base):
duration = Column(String) duration = Column(String)
reader = Column(String) reader = Column(String)
genres = relationship("AudiobookGenre", secondary="audiobook_to_genre",
lazy="selectin")
owner_id = Column(Integer, ForeignKey("users.id")) owner_id = Column(Integer, ForeignKey("users.id"))

View File

@@ -0,0 +1,24 @@
from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String
from sqlalchemy.orm import relationship
from ..database import Base
class GameGenre(Base):
__tablename__ = "game_genres"
id = Column(Integer, primary_key=True)
genre = Column(String, nullable=False, unique=True)
games = relationship("Game", secondary="game_to_genre",
lazy="selectin")
class GameToGenre(Base):
__tablename__ = "game_to_genre"
__table_args__ = (
PrimaryKeyConstraint("game_id", "genre_id"),
)
game_id = Column(Integer, ForeignKey("games.id"), nullable=False)
genre_id = Column(Integer, ForeignKey("game_genres.id"), nullable=False)

View File

@@ -1,4 +1,5 @@
from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from ..database import Base from ..database import Base
@@ -11,7 +12,6 @@ class Game(Base):
cover = Column(String) cover = Column(String)
description = Column(String) description = Column(String)
torrent_file = Column(String, nullable=False) torrent_file = Column(String, nullable=False)
upload_date = Column(String, nullable=False)
trailer = Column(String) trailer = Column(String)
system = Column(String) system = Column(String)
@@ -27,4 +27,8 @@ class Game(Base):
release_date = Column(String) release_date = Column(String)
download_size = Column(String) download_size = Column(String)
genres = relationship("GameGenre", secondary="game_to_genre",
lazy="selectin")
owner_id = Column(Integer, ForeignKey("users.id")) owner_id = Column(Integer, ForeignKey("users.id"))
owner = relationship("User", lazy="selectin", viewonly=True)

View File

@@ -0,0 +1,24 @@
from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String
from sqlalchemy.orm import relationship
from ..database import Base
class MovieActor(Base):
__tablename__ = "movie_actors"
id = Column(Integer, primary_key=True)
actor = Column(String, nullable=False, unique=True)
movies = relationship("Movies", secondary="movie_to_actor",
lazy="selectin")
class MovieToActor(Base):
__tablename__ = "movie_to_actor"
__table_args__ = (
PrimaryKeyConstraint("movie_id", "actor_id"),
)
movie_id = Column(Integer, ForeignKey("movies.id"), nullable=False)
actor_id = Column(Integer, ForeignKey("movie_actors.id"), nullable=False)

View File

@@ -0,0 +1,24 @@
from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String
from sqlalchemy.orm import relationship
from ..database import Base
class MovieGenre(Base):
__tablename__ = "movie_genres"
id = Column(Integer, primary_key=True)
genre = Column(String, nullable=False, unique=True)
movies = relationship("Movies", secondary="movie_to_genre",
lazy="selectin")
class MovieToGenre(Base):
__tablename__ = "movie_to_genre"
__table_args__ = (
PrimaryKeyConstraint("movie_id", "genre_id"),
)
movie_id = Column(Integer, ForeignKey("movies.id"), nullable=False)
genre_id = Column(Integer, ForeignKey("movie_genres.id"), nullable=False)

View File

@@ -1,4 +1,5 @@
from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from ..database import Base from ..database import Base
@@ -14,7 +15,6 @@ class Movie(Base):
description = Column(String) description = Column(String)
torrent_file = Column(String, nullable=False) torrent_file = Column(String, nullable=False)
upload_date = Column(String, nullable=False)
trailer = Column(String) trailer = Column(String)
update_date = Column(String, nullable=False) update_date = Column(String, nullable=False)
language = Column(String) language = Column(String)
@@ -25,4 +25,10 @@ class Movie(Base):
duration = Column(String) duration = Column(String)
country = Column(String) country = Column(String)
genres = relationship("MovieGenre", secondary="movie_to_genre",
lazy="selectin")
actors = relationship("MovieActor", secondary="movie_to_actor",
lazy="selectin")
owner_id = Column(Integer, ForeignKey("users.id")) owner_id = Column(Integer, ForeignKey("users.id"))

View File

@@ -11,3 +11,7 @@ class User(Base):
email = Column(String, nullable=False, unique=True) email = Column(String, nullable=False, unique=True)
name = Column(String, nullable=False) name = Column(String, nullable=False)
hash_of_password = Column(String, nullable=False) hash_of_password = Column(String, nullable=False)
games = relationship("Game", viewonly=True)
movies = relationship("Movie", viewonly=True)
audiobooks = relationship("Audiobook", viewonly=True)

View File

@@ -1,4 +1,11 @@
from .games import * from .games import *
from .game_genres import *
from .movies import * from .movies import *
from .movie_genres import *
from .movie_actors import *
from .audiobooks import * from .audiobooks import *
from .audiobook_genres import *
from .users import * from .users import *

View File

@@ -0,0 +1,15 @@
from pydantic import BaseModel, ConfigDict, Field
class AudiobookGenreBase(BaseModel):
genre: str = Field(default=None, examples=["Боевик"])
class AudiobookGenreCreate(AudiobookGenreBase):
pass
class AudiobookGenre(AudiobookGenreBase):
id: int = Field(examples=[1])
model_config = ConfigDict(from_attributes=True)

View File

@@ -1,6 +1,9 @@
from typing import Optional from typing import Optional
from pydantic import BaseModel, ConfigDict, Field from pydantic import BaseModel, ConfigDict, Field
from .users import UserOpenData as User
from .audiobook_genres import AudiobookGenre
class AudiobookCardBase(BaseModel): class AudiobookCardBase(BaseModel):
title: str = Field(examples=["Марсианин"]) title: str = Field(examples=["Марсианин"])
@@ -39,13 +42,15 @@ class AudiobookBase(AudiobookCardBase):
class AudiobookCreate(AudiobookBase): class AudiobookCreate(AudiobookBase):
pass genres: Optional[list[int]] = Field(default=None, examples=[[1, 2]])
class Audiobook(AudiobookBase): class Audiobook(AudiobookBase):
id: int = Field(examples=[1]) id: int = Field(examples=[1])
update_date: str = Field(examples=["2024-06-14 12:00:00"]) update_date: str = Field(examples=["2024-06-14 12:00:00"])
upload_date: str = Field(examples=["2024-06-14 12:00:00"])
owner_id: int = Field(examples=[1]) genres: list[AudiobookGenre] = Field()
owner: User = Field()
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)

View File

@@ -0,0 +1,16 @@
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
class GameGenreBase(BaseModel):
genre: str = Field(default=None, examples=["Стратегия"])
class GameGenreCreate(GameGenreBase):
pass
class GameGenre(GameGenreBase):
id: int = Field(examples=[1])
model_config = ConfigDict(from_attributes=True)

View File

@@ -1,6 +1,9 @@
from typing import Optional from typing import Optional
from pydantic import BaseModel, ConfigDict, Field from pydantic import BaseModel, ConfigDict, Field
from .users import UserOpenData as User
from .game_genres import GameGenre
class GameCardBase(BaseModel): class GameCardBase(BaseModel):
title: str = Field(examples=["DwarfFortress"]) title: str = Field(examples=["DwarfFortress"])
@@ -40,13 +43,15 @@ class GameBase(GameCardBase):
class GameCreate(GameBase): class GameCreate(GameBase):
pass genres: Optional[list[int]] = Field(default=None, examples=[[1, 2]])
class Game(GameBase): class Game(GameBase):
id: int = Field(examples=[1]) id: int = Field(examples=[1])
update_date: str = Field(examples=["2024-05-13 12:00:00"]) update_date: str = Field(examples=["2024-05-13 12:00:00"])
upload_date: str = Field(examples=["2024-05-13 12:00:00"])
owner_id: int = Field(examples=[1]) genres: list[GameGenre] = Field()
owner: User = Field()
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)

View File

@@ -0,0 +1,15 @@
from pydantic import BaseModel, ConfigDict, Field
class MovieActorBase(BaseModel):
actor: str = Field(default=None, examples=["Мэттью Макконахи"])
class MovieActorCreate(MovieActorBase):
pass
class MovieActor(MovieActorBase):
id: int = Field(examples=[1])
model_config = ConfigDict(from_attributes=True)

View File

@@ -0,0 +1,15 @@
from pydantic import BaseModel, ConfigDict, Field
class MovieGenreBase(BaseModel):
genre: str = Field(default=None, examples=["Фантастика"])
class MovieGenreCreate(MovieGenreBase):
pass
class MovieGenre(MovieGenreBase):
id: int = Field(examples=[1])
model_config = ConfigDict(from_attributes=True)

View File

@@ -1,6 +1,10 @@
from typing import Optional from typing import Optional
from pydantic import BaseModel, ConfigDict, Field from pydantic import BaseModel, ConfigDict, Field
from .users import UserOpenData as User
from .movie_genres import MovieGenre
from .movie_actors import MovieActor
class MovieCardBase(BaseModel): class MovieCardBase(BaseModel):
title: str = Field(examples=["Интерстеллар"]) title: str = Field(examples=["Интерстеллар"])
@@ -43,13 +47,17 @@ class MovieBase(MovieCardBase):
class MovieCreate(MovieBase): class MovieCreate(MovieBase):
pass genres: Optional[list[int]] = Field(default=None, examples=[[1, 2]])
actors: Optional[list[int]] = Field(default=None, examples=[[1, 2]])
class Movie(MovieBase): class Movie(MovieBase):
id: int = Field(examples=[1]) id: int = Field(examples=[1])
update_date: str = Field(examples=["2024-06-11 12:00:00"]) update_date: str = Field(examples=["2024-06-11 12:00:00"])
upload_date: str = Field(examples=["2024-06-11 12:00:00"])
owner_id: int = Field(examples=[1]) genres: list[MovieGenre] = Field()
actors: list[MovieActor] = Field()
owner: User = Field()
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)