1
0
mirror of https://github.com/ijaric/voice_assistant.git synced 2025-05-24 14:33:26 +00:00

fix: postgres client & dispose engine

This commit is contained in:
Artem Litvinov 2023-09-30 21:09:36 +01:00
parent 5d31ae0fdc
commit c0c4a566c4
5 changed files with 55 additions and 51 deletions

View File

@ -10,6 +10,7 @@ import lib.api.v1.handlers as api_v1_handlers
import lib.app.errors as app_errors import lib.app.errors as app_errors
import lib.app.settings as app_settings import lib.app.settings as app_settings
import lib.app.split_settings as app_split_settings import lib.app.split_settings as app_split_settings
import lib.clients as clients
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -43,6 +44,14 @@ class Application:
# Global clients # Global clients
logger.info("Initializing global clients") logger.info("Initializing global clients")
postgres_client = clients.AsyncPostgresClient(settings=settings)
disposable_resources.append(
DisposableResource(
name="postgres_client",
dispose_callback=postgres_client.dispose_callback(),
)
)
# Clients # Clients

View File

@ -4,19 +4,28 @@ import pydantic_settings
import lib.app.split_settings.utils as app_split_settings_utils import lib.app.split_settings.utils as app_split_settings_utils
class DBSettings(pydantic_settings.BaseSettings): class PostgresSettings(pydantic_settings.BaseSettings):
"""Parent DB Settings Class.""" """Postgres settings."""
model_config = pydantic_settings.SettingsConfigDict(
env_file=app_split_settings_utils.ENV_PATH,
env_prefix="POSTGRES_",
env_file_encoding="utf-8",
extra="ignore",
)
# Connection settings # Connection settings
driver: str driver: str = "postgresql+asyncpg"
db_name: str db_name: str = "database_name"
host: str host: str = "localhost"
port: int port: int = 5432
user: str user: str = "app"
password: pydantic.SecretStr password: pydantic.SecretStr = pydantic.Field(
default=..., validation_alias=pydantic.AliasChoices("password", "postgres_password")
)
# Enginge settings # Engine settings
pool_size: int = 10 pool_size: int = 50
pool_pre_ping: bool = True pool_pre_ping: bool = True
echo: bool = False echo: bool = False
@ -33,23 +42,3 @@ class DBSettings(pydantic_settings.BaseSettings):
@property @property
def dsn_as_safe_url(self) -> str: def dsn_as_safe_url(self) -> str:
return f"{self.driver}://{self.user}:***@{self.host}:{self.port}" return f"{self.driver}://{self.user}:***@{self.host}:{self.port}"
class PostgresSettings(DBSettings):
"""Postgres settings."""
model_config = pydantic_settings.SettingsConfigDict(
env_file=app_split_settings_utils.ENV_PATH,
env_prefix="POSTGRES_",
env_file_encoding="utf-8",
extra="ignore",
)
driver: str = "postgresql+asyncpg"
db_name: str = "database_name"
host: str = "localhost"
port: int = 5432
user: str = "app"
password: pydantic.SecretStr = pydantic.Field(
default=..., validation_alias=pydantic.AliasChoices("password", "postgres_password")
)

View File

@ -1,3 +1,3 @@
from .postgres import get_async_session from .postgres import AsyncPostgresClient
__all__ = ["get_async_session"] __all__ = ["AsyncPostgresClient"]

View File

@ -1,24 +1,30 @@
import sqlalchemy.ext.asyncio as sa_asyncio import sqlalchemy.ext.asyncio as sa_asyncio
import lib.app.split_settings as app_split_settings import lib.app.settings as app_settings
async def get_async_session( class AsyncPostgresClient:
settings: app_split_settings.DBSettings, """Async Postgres Client that return sessionmaker."""
) -> sa_asyncio.async_sessionmaker[sa_asyncio.AsyncSession]:
engine = sa_asyncio.create_async_engine(
url=settings.dsn,
pool_size=settings.pool_size,
pool_pre_ping=settings.pool_pre_ping,
echo=settings.echo,
future=True,
)
async_session = sa_asyncio.async_sessionmaker( def __init__(self, settings: app_settings.Settings) -> None:
bind=engine, self.settings = settings.postgres
autocommit=settings.auto_commit, self.async_enging = sa_asyncio.create_async_engine(
autoflush=settings.auto_flush, url=self.settings.dsn,
expire_on_commit=settings.expire_on_commit, pool_size=self.settings.pool_size,
) pool_pre_ping=self.settings.pool_pre_ping,
echo=self.settings.echo,
future=True,
)
return async_session # noqa: RET504 def get_async_session(self) -> sa_asyncio.async_sessionmaker[sa_asyncio.AsyncSession]:
async_session = sa_asyncio.async_sessionmaker(
bind=self.async_enging,
autocommit=self.settings.auto_commit,
autoflush=self.settings.auto_flush,
expire_on_commit=self.settings.expire_on_commit,
)
return async_session # noqa: RET504
async def dispose_callback(self) -> None:
await self.async_enging.dispose()

View File

@ -1,4 +1,4 @@
from .base_sqlalchemy import Base, IdCreatedUpdatedBaseMixin from .base_sqlalchemy import Base, IdCreatedUpdatedBaseMixin
from .token import Token from .token import Token
__all__ = ["Base", "Token", "IdCreatedUpdatedBaseMixin"] __all__ = ["Base", "IdCreatedUpdatedBaseMixin", "Token"]