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

Рабочий Postgres

This commit is contained in:
grucshetskyaleksei 2023-09-20 00:07:12 +03:00
parent cf1a29d520
commit b1b5b5ce68
7 changed files with 56 additions and 38 deletions

View File

@ -1,10 +1,10 @@
db_host=db DB_HOST=db
db_port=5432 DB_PORT=5432
db_user=user DB_USER=user
db_password=Qwe123 DB_PASSWORD=Qwe123
db_name=notification_admin DB_NAME=api_db
server_host=0.0.0.0 SERVER_HOST=0.0.0.0
server_port=8000 SERVER_PORT=8000
jwt_secret_key=v9LctjUWwol4XbvczPiLFMDtZ8aal7mm JWT_SECRET_KEY=v9LctjUWwol4XbvczPiLFMDtZ8aal7mm

View File

@ -4,13 +4,13 @@ services:
db: db:
image: postgres:15.2 image: postgres:15.2
environment: environment:
POSTGRES_USER: ${db_user} POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${db_password} POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${db_name} POSTGRES_DB: ${DB_NAME}
env_file: env_file:
- .env - .env
ports: ports:
- "${db_port}:{db_port}" - "${DB_PORT}:${DB_PORT}"
volumes: volumes:
- postgres_data:/var/lib/postgresql/data/ - postgres_data:/var/lib/postgresql/data/
restart: always restart: always
@ -25,7 +25,7 @@ services:
restart: always restart: always
entrypoint: ["/opt/app/entrypoint.sh"] entrypoint: ["/opt/app/entrypoint.sh"]
ports: ports:
- "${server_port}:{server_port}" - "${SERVER_PORT}:${SERVER_PORT}"
depends_on: depends_on:
- db - db
env_file: env_file:

View File

@ -4,13 +4,13 @@ services:
db: db:
image: postgres:15.2 image: postgres:15.2
environment: environment:
POSTGRES_USER: ${db_user} POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${db_password} POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${db_name} POSTGRES_DB: ${DB_NAME}
env_file: env_file:
- .env - .env
ports: ports:
- "127.0.0.1:${db_port}:{db_port}" - "127.0.0.1:${DB_PORT}:${DB_PORT}"
volumes: volumes:
- postgres_data:/var/lib/postgresql/data/ - postgres_data:/var/lib/postgresql/data/
restart: always restart: always
@ -20,7 +20,7 @@ services:
api: api:
build: build:
context: . context: .
container_name: fastapi_app container_name: api
image: fastapi_app image: fastapi_app
restart: always restart: always
entrypoint: ["/opt/app/entrypoint.sh"] entrypoint: ["/opt/app/entrypoint.sh"]

View File

@ -18,8 +18,12 @@ class BaseMixin:
@declared_attr @declared_attr
def created_at(cls): def created_at(cls):
return sqlalchemy.Column(sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now()) return sqlalchemy.Column(
sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now()
)
@declared_attr @declared_attr
def updated_at(cls): def updated_at(cls):
return sqlalchemy.Column(sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now()) return sqlalchemy.Column(
sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now()
)

View File

@ -1,10 +1,9 @@
import fastapi
from jose import JWTError, jwt from jose import JWTError, jwt
from pydantic import ValidationError
from lib.api import schemas as app_schemas from lib.api import schemas as app_schemas
from lib.app import settings as app_settings from lib.app import settings as app_settings
from pydantic import ValidationError
import fastapi
app = fastapi.FastAPI() app = fastapi.FastAPI()
settings = app_settings.get_settings() settings = app_settings.get_settings()
@ -13,7 +12,9 @@ security = fastapi.security.HTTPBearer()
def get_token_data( def get_token_data(
authorization: fastapi.security.HTTPAuthorizationCredentials = fastapi.Security(security), authorization: fastapi.security.HTTPAuthorizationCredentials = fastapi.Security(
security
),
) -> app_schemas.entity.Token: ) -> app_schemas.entity.Token:
token = authorization.credentials token = authorization.credentials
try: try:

View File

@ -1,10 +1,7 @@
import functools import functools
import pydantic_settings import pydantic_settings
from dotenv import load_dotenv from pydantic import Field, field_validator
from pydantic import Field
load_dotenv(".env.dev")
class DbSettings(pydantic_settings.BaseSettings): class DbSettings(pydantic_settings.BaseSettings):
@ -25,11 +22,17 @@ class ApiSettings(pydantic_settings.BaseSettings):
class Settings(pydantic_settings.BaseSettings): class Settings(pydantic_settings.BaseSettings):
debug: str = "false"
db: DbSettings = Field(default_factory=DbSettings) db: DbSettings = Field(default_factory=DbSettings)
api: ApiSettings = Field(default_factory=ApiSettings) api: ApiSettings = Field(default_factory=ApiSettings)
jwt_secret_key: str jwt_secret_key: str
@field_validator("debug")
@classmethod
def validate_debug(cls, v: str) -> bool:
return v.lower() == "true"
@functools.lru_cache @functools.lru_cache
def get_settings() -> Settings: def get_settings() -> Settings:

View File

@ -15,17 +15,27 @@ class Base(DeclarativeBase):
# Создаём движок # Создаём движок
# Настройки подключения к БД передаём из переменных окружения, которые заранее загружены в файл настроек # Настройки подключения к БД передаём из переменных окружения, которые заранее загружены в файл настроек
class AsyncDB:
database_dsn = ( def __init__(self):
self.database_dsn = (
f"postgresql+asyncpg://{settings.db.user}:{settings.db.password}" f"postgresql+asyncpg://{settings.db.user}:{settings.db.password}"
f"@{settings.db.host}:{settings.db.port}/{settings.db.name}" f"@{settings.db.host}:{settings.db.port}/{settings.db.name}"
) )
self.engine = create_async_engine(
self.database_dsn, echo=settings.debug, future=True
)
self.async_session = async_sessionmaker(
self.engine, class_=AsyncSession, expire_on_commit=False
)
engine = create_async_engine(database_dsn, echo=True, future=True)
async_session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) db = AsyncDB()
async def get_session() -> typing.AsyncGenerator[AsyncSession, typing.Any]: async def get_session() -> typing.AsyncGenerator[AsyncSession, typing.Any]:
async with async_session() as session: async with db.async_session() as session:
try:
yield session yield session
except Exception:
await session.rollback()
raise