From: Michael Tremer Date: Wed, 2 Jul 2025 15:00:11 +0000 (+0000) Subject: sources: Migrate to SQLModel X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0f7f4b5215c3e2305b56908147d66d749a5fabf;p=pbs.git sources: Migrate to SQLModel Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/sources.py b/src/buildservice/sources.py index 117116d3..a5ddc4f2 100644 --- a/src/buildservice/sources.py +++ b/src/buildservice/sources.py @@ -8,11 +8,9 @@ import logging import os import re import sqlalchemy +import sqlmodel import tempfile -from sqlalchemy import Column, ForeignKey -from sqlalchemy import DateTime, Integer, Text - from . import base from . import database from . import config @@ -145,7 +143,7 @@ class Sources(base.Object): await job.run() -class Source(database.Base, database.BackendMixin, database.SoftDeleteMixin): +class Source(sqlmodel.SQLModel, database.BackendMixin, database.SoftDeleteMixin, table=True): __tablename__ = "sources" def __str__(self): @@ -153,44 +151,45 @@ class Source(database.Base, database.BackendMixin, database.SoftDeleteMixin): # ID - id = Column(Integer, primary_key=True) + id: int = sqlmodel.Field(primary_key=True, exclude=True) # Name - name = Column(Text, nullable=False) + name: str # Slug - slug = Column(Text, unique=True, nullable=False) + # XXX Must be unique + slug: str # URL - url = Column(Text, nullable=False) + url: str # Gitweb - gitweb = Column(Text) + gitweb: str | None = None # Revision - revision = Column(Text) + revision: str | None = None # Branch - branch = Column(Text, nullable=False) + branch: str # Last Fetched At - last_fetched_at = Column(DateTime(timezone=False)) + last_fetched_at: datetime.datetime | None = None # Repo ID - repo_id = Column(Integer, ForeignKey("repositories.id"), nullable=False) + repo_id: int = sqlmodel.Field(foreign_key="repositories.id", exclude=True) # Repo - repo = sqlalchemy.orm.relationship( - "Repo", foreign_keys=[repo_id], lazy="joined", innerjoin=True, + repo: "Repo" = sqlmodel.Relationship( + sa_relationship_kwargs={ "lazy" : "joined" }, ) # Distro @@ -201,27 +200,28 @@ class Source(database.Base, database.BackendMixin, database.SoftDeleteMixin): # Created At - created_at = Column(DateTime(timezone=False), nullable=False, - server_default=sqlalchemy.func.current_timestamp()) + created_at : datetime.datetime = sqlmodel.Field( + sa_column_kwargs = {"server_default" : sqlalchemy.text("CURRENT_TIMESTAMP")} + ) # Created By ID - created_by_id = Column(Integer, ForeignKey("users.id")) + created_by_id: int = sqlmodel.Field(foreign_key="users.id", exclude=True) # Created By - created_by = sqlalchemy.orm.relationship( - "User", foreign_keys=[created_by_id], lazy="joined", innerjoin=True, + created_by: "User" = sqlmodel.Relationship( + sa_relationship_kwargs={ "foreign_keys" : "[Source.created_by_id]" }, ) # Deleted By ID - deleted_by_id = Column(Integer, ForeignKey("users.id")) + deleted_by_id: int = sqlmodel.Field(foreign_key="users.id", exclude=True) # Deleted By - deleted_by = sqlalchemy.orm.relationship( - "User", foreign_keys=[deleted_by_id], lazy="joined", + deleted_by: "User" = sqlmodel.Relationship( + sa_relationship_kwargs={ "foreign_keys" : "[Source.deleted_by_id]" }, ) # Path @@ -389,7 +389,7 @@ class Source(database.Base, database.BackendMixin, database.SoftDeleteMixin): self.last_fetched_at = sqlalchemy.func.current_timestamp() -class SourceCommit(database.Base, database.BackendMixin, database.SoftDeleteMixin): +class SourceCommit(sqlmodel.SQLModel, database.BackendMixin, database.SoftDeleteMixin, table=True): __tablename__ = "source_commits" def __str__(self): @@ -397,41 +397,41 @@ class SourceCommit(database.Base, database.BackendMixin, database.SoftDeleteMixi # ID - id = Column(Integer, primary_key=True) + id: int = sqlmodel.Field(primary_key=True, exclude=True) # Source ID - source_id = Column(Integer, ForeignKey("sources.id"), nullable=False) + source_id: int = sqlmodel.Field(foreign_key="sources.id") # Source - source = sqlalchemy.orm.relationship( - "Source", foreign_keys=[source_id], lazy="joined", + source: "Source" = sqlmodel.Relationship( + sa_relationship_kwargs={ "lazy" : "selectin" }, ) # Revision - revision = Column(Text, nullable=False) + revision: str # Author - author = Column(Text, nullable=False) + author: str # Committer - committer = Column(Text, nullable=False) + committer: str # Date - date = Column(DateTime(timezone=False), nullable=False) + date: datetime.datetime # Subject - subject = Column(Text, nullable=False) + subject: str # Body - body = Column(Text, nullable=False) + body: str @functools.cached_property def message(self): @@ -545,12 +545,12 @@ class SourceCommit(database.Base, database.BackendMixin, database.SoftDeleteMixi # Build Group ID - build_group_id = Column(Integer, ForeignKey("build_groups.id")) + build_group_id: int = sqlmodel.Field(foreign_key="build_groups.id", exclude=True) # Build Group - builds = sqlalchemy.orm.relationship( - "BuildGroup", foreign_keys=[build_group_id], lazy="selectin", + builds: "BuildGroup" = sqlmodel.Relationship( + sa_relationship_kwargs={ "lazy" : "selectin" }, ) # Jobs @@ -600,38 +600,38 @@ class SourceCommit(database.Base, database.BackendMixin, database.SoftDeleteMixi self.finished_at = sqlalchemy.func.current_timestamp() -class SourceJob(database.Base, database.BackendMixin): +class SourceJob(sqlmodel.SQLModel, database.BackendMixin, table=True): __tablename__ = "source_commit_jobs" # ID - id = Column(Integer, primary_key=True) + id: int = sqlmodel.Field(primary_key=True, exclude=True) # Commit ID - commit_id = Column(Integer, ForeignKey("source_commits.id"), nullable=False) + commit_id: int = sqlmodel.Field(foreign_key="source_commits.id", exclude=True) # Commit - commit = sqlalchemy.orm.relationship( - "SourceCommit", foreign_keys=[commit_id], lazy="joined", + commit: "SourceCommit" = sqlmodel.Relationship( + sa_relationship_kwargs={ "lazy" : "joined" }, ) # Action - action = Column(Text, nullable=False) + action: str # Name - name = Column(Text, nullable=False) + name: str # Finished At - finished_at = Column(DateTime(timezone=False)) + finished_at: datetime.datetime # Error - error = Column(Text) + error: str = "" # Status