Library to generate repository for SQLAlchemy based on ORM Models
Project description
SQLRepositoryGenerator
Description
SQLRepositoryGenerator is a wrapper above SQLAlchemy to allow the generation of Repository class from SQLAlchemy models.
This way one can concentrate the repository code to non standard SQL query and have the common one auto generated.
Installation
pip install sql-repository-generator
Usage
to use SQLRepositoryGenerator, it is needed to make a child class of one of the Repository base class
AsyncRepository
AsyncRepository is a base class that just hide the internal of query making for a given model
Example
from typing import Annotated
from uuid import UUID, uuid4
from sqlalchemy import ForeignKey
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped, relationship
from sqlgen import AsyncRepository
UUID_PK = Annotated[UUID, mapped_column(primary_key=True)]
PROJECT_FK = Annotated[UUID, mapped_column(ForeignKey("project.id"))]
class Base(DeclarativeBase):
id: Mapped[UUID_PK] = mapped_column(default=uuid4)
class Host(Base):
__tablename__ = "host"
name: Mapped[str]
project_id: Mapped[PROJECT_FK]
project: Mapped["Project"] = relationship(back_populates="hosts")
class HostRepository(AsyncRepository):
cls = Host # Model to query
async def main(session: AsyncSession):
repository = HostRepository(session)
host = await repository.create(name="toto")
hosts = await repository.get_all()
AsyncObjectBoundRepository
AsyncObjectBoundRepository allows to have a repository filtered for a specific object_id:
Example
from typing import Annotated
from uuid import UUID, uuid4
from sqlalchemy import ForeignKey
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped, relationship
from sqlgen import AsyncObjectBoundRepository
UUID_PK = Annotated[UUID, mapped_column(primary_key=True)]
HOST_FK = Annotated[UUID, mapped_column(ForeignKey("host.id"))]
PROJECT_FK = Annotated[UUID, mapped_column(ForeignKey("project.id"))]
class Base(DeclarativeBase):
id: Mapped[UUID_PK] = mapped_column(default=uuid4)
class Webserver(Base):
__tablename__ = "webserver"
host_id: Mapped[HOST_FK]
host: Mapped["Host"] = relationship(back_populates="webservers")
class Host(Base):
__tablename__ = "host"
name: Mapped[str]
project_id: Mapped[PROJECT_FK]
project: Mapped["Project"] = relationship(back_populates="hosts")
webservers: Mapped[list["Webserver"]] = relationship(back_populates="host", cascade="all, delete-orphan")
class Project(Base):
__tablename__ = "project"
hosts: Mapped[list["Host"]] = relationship(back_populates="project", cascade="all, delete-orphan")
class WebserverRepository(AsyncObjectBoundRepository):
cls = Webserver # Model to query
bound_model = Project
async def main(session: AsyncSession):
project_id = uuid4()
repository = WebserverRepository(session, project_id)
host = await repository.create(name="toto") # Not Filtered
hosts = await repository.get_all() # filtered by Webserver.host.project.id == project_id
Support
Any help is welcome. you can either:
- create an issue
- look for TODO in the code and provide a MR with changes
- provide a MR for support of new class
Roadmap
- Make a public python package
Authors and acknowledgment
Currently, solely developed by Tagashy but any help is welcomed and will be credited here.
License
See the LICENSE file for licensing information as it pertains to files in this repository.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file sql-repository-generator-0.5.0.tar.gz
.
File metadata
- Download URL: sql-repository-generator-0.5.0.tar.gz
- Upload date:
- Size: 11.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.12.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6d414b83554a1f989059cdde59e338f31e58d68bf20766898aedf95ebcdf9822 |
|
MD5 | 2c7bdbe8882a9c67121f3823f7e159b3 |
|
BLAKE2b-256 | c7032ab7704e0ae2441edde0741adb546e46f77c2975acabc7642bea18fa74f3 |
File details
Details for the file sql_repository_generator-0.5.0-py3-none-any.whl
.
File metadata
- Download URL: sql_repository_generator-0.5.0-py3-none-any.whl
- Upload date:
- Size: 14.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.12.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5708942ebcf2763ae3fde3134daf5aabf5bf3f96899c30a5bb96da449a58f5d7 |
|
MD5 | fa5335979413459c2f9a8feaebef0225 |
|
BLAKE2b-256 | 40464596528b04a320da37fa3f62ab23a43549765771767c59eb4bb67c7346a3 |