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:
parent
5d31ae0fdc
commit
c0c4a566c4
|
@ -10,6 +10,7 @@ import lib.api.v1.handlers as api_v1_handlers
|
|||
import lib.app.errors as app_errors
|
||||
import lib.app.settings as app_settings
|
||||
import lib.app.split_settings as app_split_settings
|
||||
import lib.clients as clients
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -43,6 +44,14 @@ class Application:
|
|||
# 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
|
||||
|
||||
|
|
|
@ -4,19 +4,28 @@ import pydantic_settings
|
|||
import lib.app.split_settings.utils as app_split_settings_utils
|
||||
|
||||
|
||||
class DBSettings(pydantic_settings.BaseSettings):
|
||||
"""Parent DB Settings Class."""
|
||||
class PostgresSettings(pydantic_settings.BaseSettings):
|
||||
"""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
|
||||
driver: str
|
||||
db_name: str
|
||||
host: str
|
||||
port: int
|
||||
user: str
|
||||
password: pydantic.SecretStr
|
||||
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")
|
||||
)
|
||||
|
||||
# Enginge settings
|
||||
pool_size: int = 10
|
||||
# Engine settings
|
||||
pool_size: int = 50
|
||||
pool_pre_ping: bool = True
|
||||
echo: bool = False
|
||||
|
||||
|
@ -33,23 +42,3 @@ class DBSettings(pydantic_settings.BaseSettings):
|
|||
@property
|
||||
def dsn_as_safe_url(self) -> str:
|
||||
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")
|
||||
)
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
from .postgres import get_async_session
|
||||
from .postgres import AsyncPostgresClient
|
||||
|
||||
__all__ = ["get_async_session"]
|
||||
__all__ = ["AsyncPostgresClient"]
|
||||
|
|
|
@ -1,24 +1,30 @@
|
|||
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(
|
||||
settings: app_split_settings.DBSettings,
|
||||
) -> 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,
|
||||
class AsyncPostgresClient:
|
||||
"""Async Postgres Client that return sessionmaker."""
|
||||
|
||||
def __init__(self, settings: app_settings.Settings) -> None:
|
||||
self.settings = settings.postgres
|
||||
self.async_enging = sa_asyncio.create_async_engine(
|
||||
url=self.settings.dsn,
|
||||
pool_size=self.settings.pool_size,
|
||||
pool_pre_ping=self.settings.pool_pre_ping,
|
||||
echo=self.settings.echo,
|
||||
future=True,
|
||||
)
|
||||
|
||||
def get_async_session(self) -> sa_asyncio.async_sessionmaker[sa_asyncio.AsyncSession]:
|
||||
async_session = sa_asyncio.async_sessionmaker(
|
||||
bind=engine,
|
||||
autocommit=settings.auto_commit,
|
||||
autoflush=settings.auto_flush,
|
||||
expire_on_commit=settings.expire_on_commit,
|
||||
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()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from .base_sqlalchemy import Base, IdCreatedUpdatedBaseMixin
|
||||
from .token import Token
|
||||
|
||||
__all__ = ["Base", "Token", "IdCreatedUpdatedBaseMixin"]
|
||||
__all__ = ["Base", "IdCreatedUpdatedBaseMixin", "Token"]
|
||||
|
|
Loading…
Reference in New Issue
Block a user