A repository library that wraps SQLAlchemy and provides built-in CRUD and a query DSL.
Project description
Base Repository
A repository library that wraps SQLAlchemy and provides built-in CRUD and a query DSL.
Once you inherit from BaseRepository, you can use create/read/update/delete right away.
- No need to re-implement simple CRUD over and over.
- If you need custom repo methods, you can add them in your project and extend freely.
- Supports introducing a Mapper for conversions between Pydantic schemas and SQLAlchemy ORM models.
Supported Dependency Versions
The table below lists the minimum required versions for each supported dependency.
To see more about how to test and the result.
| python_version | sqlalchemy | pydantic |
|---|---|---|
| 3.10 | >= 1.4 | >= 1.10 |
| >= 3.13 | >= 1.4 | >= 2.8, 1.7-1.10 |
Links
Installation
pip install base-repository
Quick Start
1) Define Filter and Repo
from dataclasses import dataclass
from pydantic import BaseModel
from base_repository import BaseRepoFilter, BaseRepository
# Example: existing SQLAlchemy ORM model and Pydantic schema in your project
class Base(DeclarativeBase):
pass
class UserModel(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(nullable=False)
class UserSchema(BaseModel):
id: int
name: str
model_config = ConfigDict(from_attributes=True)
# What you need to add for Base Repository: Filter + Repo
@dataclass
class UserFilter(BaseRepoFilter):
id: int | iterable[int] | None = None
name: str | iterable[str] | None = None
class UserRepo(BaseRepository[UserModel]):
filter_class = UserFilter
mapping_schema = UserSchema # Optional: return Pydantic objects by default
2) Plug in a SessionProvider
Decide how the repository should obtain an AsyncSession.
Recommended: inject a SessionProvider once, so the repo can fetch sessions when needed.
from typing import Protocol
from base_repository import SessionProvider, BaseRepository
# Example SessionProvider implementation
class MysqlSessionProvider(SessionProvider):
def get_session(self) -> AsyncSession:
return Mysql.current_session()
BaseRepository.configure_session_provider(MysqlSessionProvider())
Alternatively, you can pass a session directly when creating the repo.
async with AsyncSession(engine) as session:
repo = UserRepo(session)
3) Use CRUD immediately
repo = UserRepo()
# Create
created = await repo.create({"name": "Alice", "email": "a@test.com"})
# Get one
user = await repo.get(UserFilter(name=["Alice", "Bob"]))
user_orm = await repo.get(UserFilter(name="Alice"), convert_domain=False)
# List (OFFSET paging)
q = (
repo.list()
.where(UserFilter(name="A"))
.order_by(["id"])
.paging(page=1, size=20)
)
users = await repo.execute(q)
# List (CURSOR paging)
q1 = (
repo.list()
.order_by(["id"])
.with_cursor(None)
.limit(20)
)
users1 = await repo.execute(q1)
# Update / Delete / Count
cnt = await repo.count(UserFilter(name="Alice"))
updated_rows = await repo.update(UserFilter(name="Bob"), {"email": "bob@new"})
deleted_rows = await repo.delete(UserFilter(name="Alice"))
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file base_repository-1.0.2.tar.gz.
File metadata
- Download URL: base_repository-1.0.2.tar.gz
- Upload date:
- Size: 5.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
503a8f3f187928438c6e6e6f6460f48389324b4a08623a8ffaa16c5f403ab2e7
|
|
| MD5 |
12e0ebcecbe8a6f186e22811193299fd
|
|
| BLAKE2b-256 |
7a479194b823ee93e71010ad7ef3697e0950894a9794190fb6ec1345ca6e45e0
|
Provenance
The following attestation bundles were made for base_repository-1.0.2.tar.gz:
Publisher:
publish.yml on 4jades/base-repository
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
base_repository-1.0.2.tar.gz -
Subject digest:
503a8f3f187928438c6e6e6f6460f48389324b4a08623a8ffaa16c5f403ab2e7 - Sigstore transparency entry: 748755728
- Sigstore integration time:
-
Permalink:
4jades/base-repository@6d23064509258d9561181a21679887cae286882a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/4jades
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6d23064509258d9561181a21679887cae286882a -
Trigger Event:
push
-
Statement type:
File details
Details for the file base_repository-1.0.2-py3-none-any.whl.
File metadata
- Download URL: base_repository-1.0.2-py3-none-any.whl
- Upload date:
- Size: 5.7 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3e14ff014a02611859fcf12783e985c0949d1f7559798852b0b816fd2628966
|
|
| MD5 |
9c41fcff06e436a983f78be33211feda
|
|
| BLAKE2b-256 |
f7fe2d002020cd8622b65cc05dd0410ac506b0d5ee46f248a6d63a13c455c79b
|
Provenance
The following attestation bundles were made for base_repository-1.0.2-py3-none-any.whl:
Publisher:
publish.yml on 4jades/base-repository
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
base_repository-1.0.2-py3-none-any.whl -
Subject digest:
f3e14ff014a02611859fcf12783e985c0949d1f7559798852b0b816fd2628966 - Sigstore transparency entry: 748755731
- Sigstore integration time:
-
Permalink:
4jades/base-repository@6d23064509258d9561181a21679887cae286882a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/4jades
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6d23064509258d9561181a21679887cae286882a -
Trigger Event:
push
-
Statement type: