refactor: use unique constraints instead of composite keys on link tables
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from typing import TYPE_CHECKING, Optional
|
||||
from collections.abc import Hashable
|
||||
|
||||
from sqlalchemy import ColumnElement, ForeignKey
|
||||
from sqlalchemy import ColumnElement, ForeignKey, UniqueConstraint
|
||||
from sqlalchemy.orm import Mapped
|
||||
from sqlalchemy.orm import mapped_column
|
||||
from sqlalchemy.orm import relationship
|
||||
@@ -35,11 +35,10 @@ class Author(BigIntAuditBase, UniqueMixin):
|
||||
|
||||
class BookAuthorLink(BigIntBase):
|
||||
__tablename__ = "book_author_links"
|
||||
__table_args__ = (UniqueConstraint("book_id", "author_id"),)
|
||||
|
||||
book_id: Mapped[int] = mapped_column(
|
||||
ForeignKey("books.id", ondelete="cascade"), primary_key=True
|
||||
)
|
||||
author_id: Mapped[int] = mapped_column(ForeignKey("authors.id"), primary_key=True)
|
||||
book_id: Mapped[int] = mapped_column(ForeignKey("books.id", ondelete="cascade"))
|
||||
author_id: Mapped[int] = mapped_column(ForeignKey("authors.id"))
|
||||
|
||||
position: Mapped[int]
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
from datetime import date
|
||||
from typing import TYPE_CHECKING, Any, Optional
|
||||
|
||||
from sqlalchemy import Index
|
||||
from sqlalchemy import ForeignKey
|
||||
from sqlalchemy import Index, ForeignKey, UniqueConstraint
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
from sqlalchemy.orm import mapped_column
|
||||
from sqlalchemy.orm import relationship
|
||||
@@ -127,11 +126,10 @@ class Book(BigIntAuditBase):
|
||||
|
||||
class Identifier(BigIntBase):
|
||||
__tablename__ = "identifiers"
|
||||
__table_args__ = (UniqueConstraint("name", "book_id"),)
|
||||
|
||||
name: Mapped[str] = mapped_column(primary_key=True)
|
||||
book_id: Mapped[int] = mapped_column(
|
||||
ForeignKey("books.id", ondelete="cascade"), primary_key=True
|
||||
)
|
||||
name: Mapped[str]
|
||||
book_id: Mapped[int] = mapped_column(ForeignKey("books.id", ondelete="cascade"))
|
||||
value: Mapped[str]
|
||||
|
||||
def __repr__(self):
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from typing import Optional
|
||||
from sqlalchemy import ForeignKey
|
||||
from sqlalchemy import ForeignKey, UniqueConstraint
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
from sqlalchemy.ext.associationproxy import association_proxy, AssociationProxy
|
||||
from sqlalchemy.ext.orderinglist import ordering_list
|
||||
@@ -38,10 +38,10 @@ class BookList(BigIntAuditBase):
|
||||
|
||||
class BookListLink(BigIntBase):
|
||||
__tablename__ = "book_list_links"
|
||||
book_id: Mapped[int] = mapped_column(
|
||||
ForeignKey("books.id", ondelete="cascade"), primary_key=True
|
||||
)
|
||||
list_id: Mapped[int] = mapped_column(ForeignKey("book_lists.id"), primary_key=True)
|
||||
__table_args__ = (UniqueConstraint("book_id", "list_id"),)
|
||||
|
||||
book_id: Mapped[int] = mapped_column(ForeignKey("books.id", ondelete="cascade"))
|
||||
list_id: Mapped[int] = mapped_column(ForeignKey("book_lists.id"))
|
||||
position: Mapped[int]
|
||||
|
||||
book: Mapped[Book] = relationship(back_populates="list_links")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from collections.abc import Hashable
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from sqlalchemy import ColumnElement, ForeignKey
|
||||
from sqlalchemy import ColumnElement, ForeignKey, UniqueConstraint
|
||||
from sqlalchemy.orm import Mapped
|
||||
from sqlalchemy.orm import mapped_column
|
||||
from sqlalchemy.orm import relationship
|
||||
@@ -35,15 +35,12 @@ class Tag(BigIntBase, UniqueMixin):
|
||||
|
||||
class BookTagLink(BigIntBase):
|
||||
__tablename__ = "book_tag_link"
|
||||
__table_args__ = (UniqueConstraint("book_id", "tag_id"),)
|
||||
|
||||
book_id: Mapped[int] = mapped_column(
|
||||
ForeignKey("books.id", ondelete="cascade"), primary_key=True
|
||||
)
|
||||
|
||||
tag_id: Mapped[int] = mapped_column(ForeignKey("tags.id"), primary_key=True)
|
||||
book_id: Mapped[int] = mapped_column(ForeignKey("books.id", ondelete="cascade"))
|
||||
tag_id: Mapped[int] = mapped_column(ForeignKey("tags.id"))
|
||||
|
||||
position: Mapped[int]
|
||||
|
||||
book: Mapped["Book"] = relationship(back_populates="tag_links")
|
||||
|
||||
tag: Mapped[Tag] = relationship()
|
||||
|
||||
Reference in New Issue
Block a user