event listens for sqlalchemy

This commit is contained in:
IluaAir
2025-08-06 23:38:17 +03:00
parent acb3eefcbe
commit 93cf7b2d24
5 changed files with 33 additions and 14 deletions

View File

@@ -29,11 +29,8 @@ async def get_user_by_id(db: sessionDep, id: int, _: CurrentOrAdmin):
@router.patch("/{id}") @router.patch("/{id}")
async def patch_user( async def patch_user(
db: sessionDep, db: sessionDep, id: int, _: CurrentOrAdmin, user_update: UserUpdate = Body()
id: int, ):
_: CurrentOrAdmin,
user_update: UserUpdate = Body()
):
updated_user = await UserService(db).update_user(id=id, update_data=user_update) updated_user = await UserService(db).update_user(id=id, update_data=user_update)
return updated_user return updated_user

View File

@@ -1,12 +1,24 @@
from datetime import datetime from datetime import datetime
from sqlalchemy import TIMESTAMP, func from sqlalchemy import TIMESTAMP, func, event
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from src.core.settings import settings from src.core.settings import settings
engine = create_async_engine(settings.db.url, echo=True) engine = create_async_engine(
settings.db.url,
echo=True
)
@event.listens_for(engine.sync_engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
if "sqlite" in settings.db.url:
cursor = dbapi_connection.cursor()
cursor.execute("PRAGMA foreign_keys=ON")
cursor.close()
async_session_maker = async_sessionmaker(bind=engine, expire_on_commit=False) async_session_maker = async_sessionmaker(bind=engine, expire_on_commit=False)

View File

@@ -1,8 +1,7 @@
from logging.config import fileConfig from logging.config import fileConfig
from sqlalchemy import engine_from_config from sqlalchemy import engine_from_config, event
from sqlalchemy import pool from sqlalchemy import pool
from alembic import context from alembic import context
from src.core.database import Base from src.core.database import Base
@@ -67,6 +66,14 @@ def run_migrations_online() -> None:
poolclass=pool.NullPool, poolclass=pool.NullPool,
) )
# Enable foreign keys for SQLite in migrations
@event.listens_for(connectable, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
print("⚙️ Enabling PRAGMA foreign_keys=ON for Alembic")
cursor = dbapi_connection.cursor()
cursor.execute("PRAGMA foreign_keys=ON")
cursor.close()
with connectable.connect() as connection: with connectable.connect() as connection:
context.configure(connection=connection, target_metadata=target_metadata) context.configure(connection=connection, target_metadata=target_metadata)

View File

@@ -1,6 +1,5 @@
from sqlalchemy import delete, select, update from sqlalchemy import delete, select, update
from schemas.users import User
from src.models import UsersORM from src.models import UsersORM
from src.repository.base import BaseRepo from src.repository.base import BaseRepo
@@ -18,7 +17,12 @@ class UsersRepo(BaseRepo):
await self.session.execute(delete(self.model).where(self.model.id == id)) await self.session.execute(delete(self.model).where(self.model.id == id))
async def update_one(self, id: int, data: dict) -> UsersORM: async def update_one(self, id: int, data: dict) -> UsersORM:
stmt = update(self.model).where(self.model.id == id).values(data.model_dump(exclude_unset=True)).returning(self.model) stmt = (
update(self.model)
.where(self.model.id == id)
.values(data.model_dump(exclude_unset=True))
.returning(self.model)
)
result = await self.session.execute(stmt) result = await self.session.execute(stmt)
model = result.scalar_one() model = result.scalar_one()
return model return model

View File

@@ -36,4 +36,3 @@ class UserService(BaseService):
user = await self.session.user.update_one(id=id, data=update_data) user = await self.session.user.update_one(id=id, data=update_data)
await self.session.commit() await self.session.commit()
return User.model_validate(user) return User.model_validate(user)