Skip to content

Commit 8777da5

Browse files
fix(admin,orm): fix user deletion and database initialization
- Add db.initialize() call before table creation - Fix sync/async delete methods for models - Fix user deletion calls in admin - Add sync methods for database operations in sync mode - Minor QuerySet improvements for sync/async first/all support
1 parent bb14042 commit 8777da5

File tree

5 files changed

+48
-30
lines changed

5 files changed

+48
-30
lines changed

example/apps/admin/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def url_for(endpoint, **kwargs):
4040
@router.get("/users", response_model=None)
4141
@requires("user_auth")
4242
async def users_view(request: Request):
43-
users = UserModel.objects.all() # type: ignore
43+
users = UserModel.objects.all().execute_all() # type: ignore
4444
# for user in users:
4545
# print("user", user)
4646

example/apps/groups/api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727
# Создание таблицы при запуске приложения
2828
@router.on_event("startup")
2929
async def create_tables():
30-
await GroupModel.create_table()
30+
GroupModel.create_table()
3131
owners_group = GroupModel.objects.filter(name="Owners").first() # type: ignore
3232
if not owners_group:
33-
await GroupModel.objects.create(name="Owners")
33+
GroupModel.objects.create(name="Owners")
3434

3535
# # Pydantic-модель для входа пользователя
3636
# class UserLogin(BaseModel):

example/apps/users/api.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
FileResponse, \
1515
HTMLResponse
1616

17+
from cotlette.core.database.sqlalchemy import db
18+
1719
ACCESS_TOKEN_EXPIRE_MINUTES = 30
1820

1921
router = APIRouter()
@@ -38,7 +40,8 @@ class TokenData(BaseModel):
3840

3941
@router.on_event("startup")
4042
async def create_tables():
41-
await UserModel.create_table()
43+
db.initialize()
44+
UserModel.create_table()
4245
existing_user = UserModel.objects.filter(email="[email protected]").first() # type: ignore
4346
if not existing_user:
4447
test_user = await create_user(UserCreate(

src/cotlette/core/database/models.py

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,26 @@ async def all(cls):
285285
result = await db.execute_async(query, fetch=True)
286286
return [cls(**dict(row)) for row in result]
287287

288-
async def delete(self):
288+
def delete(self):
289+
"""
290+
Удаляет запись из базы данных.
291+
"""
292+
from cotlette.core.database.query import should_use_async
293+
if should_use_async():
294+
return self._delete_async()
295+
else:
296+
return self._delete_sync()
297+
298+
def _delete_sync(self):
299+
"""
300+
Синхронно удаляет запись из базы данных.
301+
"""
302+
if hasattr(self, 'id') and self.id is not None:
303+
table_name = self.get_table_name()
304+
query = f"DELETE FROM {table_name} WHERE id = {self.id}"
305+
db.execute(query)
306+
307+
async def _delete_async(self):
289308
"""
290309
Асинхронно удаляет запись из базы данных.
291310
"""
@@ -294,29 +313,4 @@ async def delete(self):
294313
query = f"DELETE FROM {table_name} WHERE id = {self.id}"
295314
await db.execute_async(query)
296315

297-
@classmethod
298-
async def create_table(cls):
299-
"""
300-
Асинхронно создает таблицу в базе данных используя SQLAlchemy.
301-
"""
302-
columns = []
303-
304-
for field_name, field in cls._fields.items():
305-
column_def = {
306-
'name': field_name,
307-
'type': field.column_type,
308-
'primary_key': field.primary_key,
309-
'nullable': not field.primary_key,
310-
'unique': field.unique
311-
}
312-
313-
# Обработка внешних ключей
314-
if isinstance(field, ForeignKeyField):
315-
related_model = field.get_related_model()
316-
table_name = related_model.get_table_name()
317-
column_def['foreign_key'] = f"{table_name}.id"
318-
319-
columns.append(column_def)
320316

321-
# Создаем таблицу через асинхронный SQLAlchemy бэкенд
322-
await db.create_table_async(cls.get_table_name(), columns)

src/cotlette/core/database/query.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,20 @@ def all(self):
5656
# Всегда возвращает QuerySet
5757
return self
5858

59+
def execute_all(self):
60+
"""Выполняет запрос и возвращает все результаты."""
61+
if should_use_async():
62+
return self._execute_async()
63+
else:
64+
return self._execute_sync()
65+
66+
async def aexecute_all(self):
67+
"""Асинхронная версия execute_all() для использования в async контексте."""
68+
if should_use_async():
69+
return await self._execute_async()
70+
else:
71+
return self._execute_sync()
72+
5973
def order_by(self, *fields):
6074
# Всегда возвращает QuerySet
6175
new_queryset = QuerySet(self.model_class)
@@ -84,6 +98,13 @@ def first(self):
8498
else:
8599
return self._first_sync()
86100

101+
async def afirst(self):
102+
"""Асинхронная версия first() для использования в async контексте."""
103+
if should_use_async():
104+
return await self._first_async()
105+
else:
106+
return self._first_sync()
107+
87108
def count(self):
88109
if should_use_async():
89110
return self._count_async()

0 commit comments

Comments
 (0)