fastapi-orm-ext


Namefastapi-orm-ext JSON
Version 0.0.5 PyPI version JSON
download
home_pageNone
SummaryFastAPI ORM Extensions
upload_time2025-07-18 14:34:03
maintainerNone
docs_urlNone
authorNone
requires_python>=3.13
licenseNone
keywords extensions fastapi orm
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # FastApi ORM Extensions

[![PyPI - Version](https://img.shields.io/pypi/v/fastapi-orm-ext.svg)](https://pypi.org/project/fastapi-orm-ext)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/fastapi-orm-ext.svg)](https://pypi.org/project/fastapi-orm-ext)

-----

## Table of Contents
- [About](#About)
- [Installation](#installation)
- [License](#license)
- [Contribution](#contribution)

## About
This library provides preset base class for your tables and repositories.
#### Use TableBase like so:
```python
from fastapi_orm_ext.table import TableBase
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column


class Table(TableBase, DeclarativeBase):
    # you can use this class in alembic's env.py file
    # to specify target_metadata for example
    __abstract__: bool = True


class User(Table, DeclarativeBase):
    name: Mapped[str] = mapped_column(nullable=False)
    email: Mapped[str | None] = mapped_column(nullable=True)
```

TableBase consists of four mixins:
- NameConventionMixin: handle name convention;
- TableNameMixin: takes model's class name and convert it to snake case, use this name while creating table in DB;
- TimestampsMixin: handles when record was created and updated;
- UUIDPrimaryKeyMixin: makes PK of UUID4 type.

#### Use Repository like so:
```python
from fastapi_orm_ext.repository import RepositoryBase
from pydantic import BaseModel

from app.tables import User
# the variant to get async session
from app.utils import get_async_session()


class CreateUserSchema(BaseModel):
    name: str
    email: str | None


class UserRepository(RepositoryBase[User]):
    # specify the model to interact with
    model = User
    # choose flush or commit
    auto_flush = True
    auto_commit = False

    # there you can define your methods
    def get_by_email(self, email: str) -> User | None:
        return (
            await self.session.execute(
                statement=select(self.model).where(self.model.email == email),
            )
        ).scalar()

# initialize UserRepository
repo = UserRepository(async_session)
# create new record in users table
data = CreateUserSchema(name="Bob", email="bob@gmail.com")
await repo.create(data)

# get record in users table by Bob's email
res: list[User] = await repo.get_by_email("bob@gmail.com")
print(res)
```

To see what else RepositoryBase can do, visit the source code of interface RepositoryBase inheriting from

## Installation

```bash
pip install fastapi-orm-ext
```
or
```bash
uv add fastapi-orm-ext
```
or
```bash
poetry add fastapi-orm-ext
```
etc


## License

`fastapi-orm-ext` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.


## Contribution
Install repository:
```bash
https://github.com/pkozhem/fastapi-orm-ext.git
```

Create virtual environment, activate it and install dependencies:
```bash
uv venv
source .venv/bin/activate
uv sync
```

Create new branch from actual tag:
```bash
git checkout <tag>
git branch pull-<fix, feat, impr>: Short branch desc
```

Pull your changes and create pull request:
```bash
git pull origin <your_branch_name>
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "fastapi-orm-ext",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.13",
    "maintainer_email": null,
    "keywords": "extensions, fastapi, orm",
    "author": null,
    "author_email": "Pavel Kozhemjachenko <pkozhem@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/3c/e2/55f911c8ed5b4da3c5963daf89451afec7878f824751405363a736497ba9/fastapi_orm_ext-0.0.5.tar.gz",
    "platform": null,
    "description": "# FastApi ORM Extensions\n\n[![PyPI - Version](https://img.shields.io/pypi/v/fastapi-orm-ext.svg)](https://pypi.org/project/fastapi-orm-ext)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/fastapi-orm-ext.svg)](https://pypi.org/project/fastapi-orm-ext)\n\n-----\n\n## Table of Contents\n- [About](#About)\n- [Installation](#installation)\n- [License](#license)\n- [Contribution](#contribution)\n\n## About\nThis library provides preset base class for your tables and repositories.\n#### Use TableBase like so:\n```python\nfrom fastapi_orm_ext.table import TableBase\nfrom sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column\n\n\nclass Table(TableBase, DeclarativeBase):\n    # you can use this class in alembic's env.py file\n    # to specify target_metadata for example\n    __abstract__: bool = True\n\n\nclass User(Table, DeclarativeBase):\n    name: Mapped[str] = mapped_column(nullable=False)\n    email: Mapped[str | None] = mapped_column(nullable=True)\n```\n\nTableBase consists of four mixins:\n- NameConventionMixin: handle name convention;\n- TableNameMixin: takes model's class name and convert it to snake case, use this name while creating table in DB;\n- TimestampsMixin: handles when record was created and updated;\n- UUIDPrimaryKeyMixin: makes PK of UUID4 type.\n\n#### Use Repository like so:\n```python\nfrom fastapi_orm_ext.repository import RepositoryBase\nfrom pydantic import BaseModel\n\nfrom app.tables import User\n# the variant to get async session\nfrom app.utils import get_async_session()\n\n\nclass CreateUserSchema(BaseModel):\n    name: str\n    email: str | None\n\n\nclass UserRepository(RepositoryBase[User]):\n    # specify the model to interact with\n    model = User\n    # choose flush or commit\n    auto_flush = True\n    auto_commit = False\n\n    # there you can define your methods\n    def get_by_email(self, email: str) -> User | None:\n        return (\n            await self.session.execute(\n                statement=select(self.model).where(self.model.email == email),\n            )\n        ).scalar()\n\n# initialize UserRepository\nrepo = UserRepository(async_session)\n# create new record in users table\ndata = CreateUserSchema(name=\"Bob\", email=\"bob@gmail.com\")\nawait repo.create(data)\n\n# get record in users table by Bob's email\nres: list[User] = await repo.get_by_email(\"bob@gmail.com\")\nprint(res)\n```\n\nTo see what else RepositoryBase can do, visit the source code of interface RepositoryBase inheriting from\n\n## Installation\n\n```bash\npip install fastapi-orm-ext\n```\nor\n```bash\nuv add fastapi-orm-ext\n```\nor\n```bash\npoetry add fastapi-orm-ext\n```\netc\n\n\n## License\n\n`fastapi-orm-ext` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.\n\n\n## Contribution\nInstall repository:\n```bash\nhttps://github.com/pkozhem/fastapi-orm-ext.git\n```\n\nCreate virtual environment, activate it and install dependencies:\n```bash\nuv venv\nsource .venv/bin/activate\nuv sync\n```\n\nCreate new branch from actual tag:\n```bash\ngit checkout <tag>\ngit branch pull-<fix, feat, impr>: Short branch desc\n```\n\nPull your changes and create pull request:\n```bash\ngit pull origin <your_branch_name>\n```\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "FastAPI ORM Extensions",
    "version": "0.0.5",
    "project_urls": {
        "Documentation": "https://github.com/pkozhem/fastapi-orm-ext#readme",
        "Issues": "https://github.com/pkozhem/fastapi-orm-ext/issues",
        "Repository": "https://github.com/pkozhem/fastapi-orm-ext",
        "Source": "https://github.com/pkozhem/fastapi-orm-ext"
    },
    "split_keywords": [
        "extensions",
        " fastapi",
        " orm"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "76794f87bf5c0868e3a0b590dd350e07287f165d356159f7bb44fbfa82f2ce49",
                "md5": "f8f1e81221164712acdd480b5d3425bb",
                "sha256": "0a160c61c7d9a296cf23ee99e3fc92e335e106299564b94cf0a6696e5fab978b"
            },
            "downloads": -1,
            "filename": "fastapi_orm_ext-0.0.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "f8f1e81221164712acdd480b5d3425bb",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.13",
            "size": 8312,
            "upload_time": "2025-07-18T14:34:02",
            "upload_time_iso_8601": "2025-07-18T14:34:02.018342Z",
            "url": "https://files.pythonhosted.org/packages/76/79/4f87bf5c0868e3a0b590dd350e07287f165d356159f7bb44fbfa82f2ce49/fastapi_orm_ext-0.0.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3ce255f911c8ed5b4da3c5963daf89451afec7878f824751405363a736497ba9",
                "md5": "d5c80531d68e6d93dfc52d0b79aabb05",
                "sha256": "0805edddfbb16a3880b3b8f162ac435400487fe69ec48f9d00c77f0e4602ac70"
            },
            "downloads": -1,
            "filename": "fastapi_orm_ext-0.0.5.tar.gz",
            "has_sig": false,
            "md5_digest": "d5c80531d68e6d93dfc52d0b79aabb05",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.13",
            "size": 24464,
            "upload_time": "2025-07-18T14:34:03",
            "upload_time_iso_8601": "2025-07-18T14:34:03.553460Z",
            "url": "https://files.pythonhosted.org/packages/3c/e2/55f911c8ed5b4da3c5963daf89451afec7878f824751405363a736497ba9/fastapi_orm_ext-0.0.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-18 14:34:03",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "pkozhem",
    "github_project": "fastapi-orm-ext#readme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "fastapi-orm-ext"
}
        
Elapsed time: 2.27262s