"""ORM model for artists.""" from sqlalchemy import String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from app.infrastructure.db.base import Base from app.infrastructure.db.models.mixins import TimestampMixin, UUIDPrimaryKeyMixin class ArtistModel(UUIDPrimaryKeyMixin, TimestampMixin, Base): __tablename__ = "artists" __table_args__ = ( # Binds a remote (browsable) artist to its local row for re-browse/save # dedup. Multiple NULLs are allowed by Postgres, so locally-created # artists (source/source_id both NULL) never collide on this. UniqueConstraint("source", "source_id", name="uq_artists_source_source_id"), ) name: Mapped[str] = mapped_column(String(512), index=True, nullable=False) musicbrainz_id: Mapped[str | None] = mapped_column(String(36), index=True, nullable=True) # -- remote identity (lazy materialization) -------------------------- source: Mapped[str | None] = mapped_column(String(32), nullable=True) source_id: Mapped[str | None] = mapped_column(String(512), nullable=True)