Source code for async_storages.integrations.sqlalchemy

from typing import Any, override
from sqlalchemy.engine.interfaces import Dialect
from sqlalchemy.types import TypeDecorator, TypeEngine, Unicode

from async_storages import StorageFile, StorageImage
from async_storages.base import BaseStorage


[docs] class FileType(TypeDecorator[Any]): """ SQLAlchemy column type for representing stored files. This type integrates with :class:`~async_storages.BaseStorage` to automatically wrap database values (file names) into :class:`~async_storages.StorageFile` objects when queried. :param storage: The storage backend used to manage file operations. :type storage: BaseStorage :param args: Additional positional arguments passed to ``TypeDecorator``. :param kwargs: Additional keyword arguments passed to ``TypeDecorator``. """ impl: TypeEngine[Any] | type[TypeEngine[Any]] = Unicode cache_ok: bool | None = True def __init__(self, storage: BaseStorage, *args: Any, **kwargs: Any): super().__init__(*args, **kwargs) self.storage: BaseStorage = storage @override def process_bind_param(self, value: Any, dialect: Dialect) -> str: if value is None: return value if isinstance(value, str): return value filename = getattr(value, "filename", None) if filename: return filename return str(value) @override def process_result_value( self, value: Any | None, dialect: Dialect ) -> StorageFile | None: if value is None: return None return StorageFile(name=value, storage=self.storage)
[docs] class ImageType(FileType): """ SQLAlchemy column type for representing stored image files. This type extends :class:`~.FileType` to automatically wrap database values (image file names) into :class:`~async_storages.StorageImage` objects when queried. It integrates with a configured :class:`~async_storages.BaseStorage` backend to provide convenient access to image operations such as resizing, thumbnail generation, or metadata retrieval. :param storage: The storage backend used to manage image file operations. :type storage: BaseStorage :param args: Additional positional arguments passed to ``FileType``. :param kwargs: Additional keyword arguments passed to ``FileType``. """ @override def process_result_value( self, value: Any | None, dialect: Dialect ) -> StorageImage | None: if value is None: return None return StorageImage(name=value, storage=self.storage)