mentortools/libs/: sqlalchemy-tools-abm-3.1.70748 metadata and description

Simple index

sqlalchemy tools

author Vasya Svintsov
author_email v.svintsov@technokert.ru
classifiers
  • Programming Language :: Python :: 3
  • Programming Language :: Python :: 3.11
description_content_type text/markdown
requires_dist
  • async-tools-abm (>=2.0.57872,<3.0.0)
  • asyncpg (>=0.27.0,<1)
  • sqlalchemy (>=2.0.9,<3.0.0)
requires_python >=3.11,<4.0
File Tox results History
sqlalchemy_tools_abm-3.1.70748-py3-none-any.whl
Size
18 KB
Type
Python Wheel
Python
3
sqlalchemy_tools_abm-3.1.70748.tar.gz
Size
12 KB
Type
Source

Installation

pip install --extra-index-url https://pypi.abm-jsc.ru sqlalchemy-tools-abm

Quick Start

Create simple entity

from sqlalchemy import Integer, String
from sqlalchemy_tools.entity_helpers.decorator import sqlalchemy_dataclass
from sqlalchemy_tools.entity_helpers.fields import sql_field
from sqlalchemy_tools.entity_helpers.setter import set_ids
from sqlalchemy_tools.entity_helpers.sqlalchemy_base import sqlalchemy_mapper_registry, register_initial_values


@sqlalchemy_dataclass(sqlalchemy_mapper_registry)
class Language:
    id: int = sql_field(Integer, primary_key=True)
    code: str = sql_field(String, default=None)


languages = [Language(code="ru"), Language(code="en")]
set_ids(*languages)
language_id_to_code = {language.id: language.code for language in languages}

register_initial_values(
    sqlalchemy_mapper_registry,
    *languages
)

Create entity with relationship

import time

from typing import List
from sqlalchemy import Integer, String, ForeignKey, BigInteger
from sqlalchemy_tools.entity_helpers.decorator import sqlalchemy_dataclass
from sqlalchemy_tools.entity_helpers.fields import sql_field, sql_relation_field
from sqlalchemy_tools.entity_helpers.sqlalchemy_base import sqlalchemy_mapper_registry

@sqlalchemy_dataclass(sqlalchemy_mapper_registry)
class CarouselImage:
    id: int = sql_field(Integer, primary_key=True)

    file_id: int = sql_field(Integer, nullable=False)
    file_name: str = sql_field(String, nullable=False)

    widget_id: int = sql_field(Integer, ForeignKey("widget.id", ondelete='CASCADE'))

@sqlalchemy_dataclass(sqlalchemy_mapper_registry)
class Widget:
    id: int = sql_field(Integer, primary_key=True)
    title: str = sql_field(String, default="")
    created_at: int = sql_field(BigInteger, default=int(time.time() * 1000))

    carousel_images: List[CarouselImage] = sql_relation_field(CarouselImage, use_list=True)

Add

from sqlalchemy_tools.database_connector.database_connector import DatabaseConnector
from sqlalchemy_tools.sqlalchemy_crud.sqlalchemy_crud import SQLAlchemyCRUD


async def add():
    config = DatabaseConnector.Config(address="postgresql://user:password@address/my_db")
    database_connector = DatabaseConnector(config=config)

    async with database_connector.get_session() as database_session:
        widget_ids = await SQLAlchemyCRUD.add(
            entity=Widget, 
            column_name_to_value_list=[
                {"created_at": 1, "title": "title1", "carousel_images": [{"file_id": 1, "file_name": "file_name1"}]},
                {"title": "title2", "carousel_images": [{"file_id": 2, "file_name": "file_name2"}, 
                                                        {"file_id": 3, "file_name": "file_name3"}]}
            ], 
            db_session=database_session
        )
        await database_session.commit()

Get

Get method  hasn't been implemented yet.

Update

from sqlalchemy_tools.database_connector.database_connector import DatabaseConnector
from sqlalchemy_tools.sqlalchemy_crud.sqlalchemy_crud import SQLAlchemyCRUD


async def update():
    config = DatabaseConnector.Config(address="postgresql://user:password@address/my_db")
    database_connector = DatabaseConnector(config=config)

    async with database_connector.get_session() as database_session:
        updated_status = await SQLAlchemyCRUD.update(
            entity=Widget,
            column_name_to_value_list=[
                {"id": 1, "title": "new_title1", "carousel_images": [{"id": 1, "file_id": 2, "file_name": "new_name"}]},
                {"id": 2, "title": "new_title2"}
            ],
            db_session=database_session
        )
        await database_session.commit()

Delete

from sqlalchemy_tools.database_connector.database_connector import DatabaseConnector
from sqlalchemy_tools.sqlalchemy_crud.sqlalchemy_crud import SQLAlchemyCRUD


async def delete():
    config = DatabaseConnector.Config(address="postgresql://user:password@address/my_db")
    database_connector = DatabaseConnector(config=config)

    async with database_connector.get_session() as database_session:
        deleted_status = await SQLAlchemyCRUD.delete(
            entity=Widget,
            filters=[Widget.id == 1],
            db_session=database_session
        )
        await database_session.commit()