Skip to content

Commit 11d7792

Browse files
authored
Bump sqlalchemy crud plus version to 1.10.0 (#668)
* Bump sqlalchemy crud plus version to 1.10.0 * Update filter style * Update filters style
1 parent 6883ec3 commit 11d7792

File tree

14 files changed

+105
-145
lines changed

14 files changed

+105
-145
lines changed

backend/app/admin/crud/crud_data_rule.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5-
from sqlalchemy import Select, and_, desc, select
5+
from sqlalchemy import Select
66
from sqlalchemy.ext.asyncio import AsyncSession
7-
from sqlalchemy.orm import noload
87
from sqlalchemy_crud_plus import CRUDPlus
98

109
from backend.app.admin.model import DataRule
@@ -31,16 +30,12 @@ async def get_list(self, name: str | None) -> Select:
3130
:param name: 规则名称
3231
:return:
3332
"""
34-
stmt = select(self.model).options(noload(self.model.scopes)).order_by(desc(self.model.created_time))
33+
filters = {}
3534

36-
filters = []
3735
if name is not None:
38-
filters.append(self.model.name.like(f'%{name}%'))
36+
filters['name__like'] = f'%{name}%'
3937

40-
if filters:
41-
stmt = stmt.where(and_(*filters))
42-
43-
return stmt
38+
return await self.select_order('id', load_strategies={'scopes': 'noload'}, **filters)
4439

4540
async def get_by_name(self, db: AsyncSession, name: str) -> DataRule | None:
4641
"""

backend/app/admin/crud/crud_data_scope.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5-
from sqlalchemy import Select, and_, desc, select
5+
from sqlalchemy import Select, select
66
from sqlalchemy.ext.asyncio import AsyncSession
7-
from sqlalchemy.orm import noload, selectinload
87
from sqlalchemy_crud_plus import CRUDPlus
98

109
from backend.app.admin.model import DataRule, DataScope
@@ -42,9 +41,7 @@ async def get_with_relation(self, db: AsyncSession, pk: int) -> DataScope:
4241
:param pk: 范围 ID
4342
:return:
4443
"""
45-
stmt = select(self.model).options(selectinload(self.model.rules)).where(self.model.id == pk)
46-
data_scope = await db.execute(stmt)
47-
return data_scope.scalars().first()
44+
return await self.select_model(db, pk, load_strategies=['rules'])
4845

4946
async def get_all(self, db: AsyncSession) -> Sequence[DataScope]:
5047
"""
@@ -63,22 +60,14 @@ async def get_list(self, name: str | None, status: int | None) -> Select:
6360
:param status: 范围状态
6461
:return:
6562
"""
66-
stmt = (
67-
select(self.model)
68-
.options(noload(self.model.rules), noload(self.model.roles))
69-
.order_by(desc(self.model.created_time))
70-
)
63+
filters = {}
7164

72-
filters = []
7365
if name is not None:
74-
filters.append(self.model.name.like(f'%{name}%'))
66+
filters['name__like'] = f'%{name}%'
7567
if status is not None:
76-
filters.append(self.model.status == status)
68+
filters['status'] = status
7769

78-
if filters:
79-
stmt = stmt.where(and_(*filters))
80-
81-
return stmt
70+
return await self.select_order('id', load_strategies={'rules': 'noload', 'roles': 'noload'}, **filters)
8271

8372
async def create(self, db: AsyncSession, obj: CreateDataScopeParam) -> None:
8473
"""

backend/app/admin/crud/crud_dept.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
from typing import Sequence
44

55
from fastapi import Request
6-
from sqlalchemy import select
76
from sqlalchemy.ext.asyncio import AsyncSession
8-
from sqlalchemy.orm import selectinload
97
from sqlalchemy_crud_plus import CRUDPlus
108

119
from backend.app.admin.model import Dept
@@ -56,16 +54,19 @@ async def get_all(
5654
:param status: 部门状态
5755
:return:
5856
"""
59-
filters = {'del_flag__eq': 0}
57+
filters = {'del_flag': 0}
58+
6059
if name is not None:
61-
filters.update(name__like=f'%{name}%')
60+
filters['name__like'] = f'%{name}%'
6261
if leader is not None:
63-
filters.update(leader__like=f'%{leader}%')
62+
filters['leader__like'] = f'%{leader}%'
6463
if phone is not None:
65-
filters.update(phone__startswith=phone)
64+
filters['phone__startswith'] = phone
6665
if status is not None:
67-
filters.update(status=status)
68-
return await self.select_models_order(db, 'sort', None, await filter_data_permission(db, request), **filters)
66+
filters['status'] = status
67+
68+
data_filtered = await filter_data_permission(db, request)
69+
return await self.select_models_order(db, 'sort', 'desc', data_filtered, **filters)
6970

7071
async def create(self, db: AsyncSession, obj: CreateDeptParam) -> None:
7172
"""
@@ -106,9 +107,7 @@ async def get_with_relation(self, db: AsyncSession, dept_id: int) -> Dept | None
106107
:param dept_id: 部门 ID
107108
:return:
108109
"""
109-
stmt = select(self.model).options(selectinload(self.model.users)).where(self.model.id == dept_id)
110-
result = await db.execute(stmt)
111-
return result.scalars().first()
110+
return await self.select_model(db, dept_id, load_strategies=['users'])
112111

113112
async def get_children(self, db: AsyncSession, dept_id: int) -> Sequence[Dept | None]:
114113
"""
@@ -118,9 +117,7 @@ async def get_children(self, db: AsyncSession, dept_id: int) -> Sequence[Dept |
118117
:param dept_id: 部门 ID
119118
:return:
120119
"""
121-
stmt = select(self.model).where(self.model.parent_id == dept_id, self.model.del_flag == 0)
122-
result = await db.execute(stmt)
123-
return result.scalars().all()
120+
return await self.select_models(db, parent_id=dept_id, del_flag=0)
124121

125122

126123
dept_dao: CRUDDept = CRUDDept(Dept)

backend/app/admin/crud/crud_login_log.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ async def get_list(self, username: str | None, status: int | None, ip: str | Non
2121
:return:
2222
"""
2323
filters = {}
24+
2425
if username is not None:
25-
filters.update(username__like=f'%{username}%')
26+
filters['username__like'] = f'%{username}%'
2627
if status is not None:
27-
filters.update(status=status)
28+
filters['status'] = status
2829
if ip is not None:
29-
filters.update(ip__like=f'%{ip}%')
30+
filters['ip__like'] = f'%{ip}%'
31+
3032
return await self.select_order('created_time', 'desc', **filters)
3133

3234
async def create(self, db: AsyncSession, obj: CreateLoginLogParam) -> None:

backend/app/admin/crud/crud_menu.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5-
from sqlalchemy import and_, asc, select
65
from sqlalchemy.ext.asyncio import AsyncSession
7-
from sqlalchemy.orm import selectinload
86
from sqlalchemy_crud_plus import CRUDPlus
97

108
from backend.app.admin.model import Menu
@@ -44,10 +42,12 @@ async def get_all(self, db: AsyncSession, title: str | None, status: int | None)
4442
:return:
4543
"""
4644
filters = {}
45+
4746
if title is not None:
48-
filters.update(title__like=f'%{title}%')
47+
filters['title__like'] = f'%{title}%'
4948
if status is not None:
50-
filters.update(status=status)
49+
filters['status'] = status
50+
5151
return await self.select_models_order(db, 'sort', **filters)
5252

5353
async def get_sidebar(self, db: AsyncSession, superuser: bool, menu_ids: list[int | None]) -> Sequence[Menu]:
@@ -59,13 +59,12 @@ async def get_sidebar(self, db: AsyncSession, superuser: bool, menu_ids: list[in
5959
:param menu_ids: 菜单 ID 列表
6060
:return:
6161
"""
62-
stmt = select(self.model).order_by(asc(self.model.sort))
63-
filters = [self.model.type.in_([0, 1, 3, 4])]
62+
filters = {'type__in': [0, 1, 3, 4]}
63+
6464
if not superuser:
65-
filters.append(self.model.id.in_(menu_ids))
66-
stmt = stmt.where(and_(*filters))
67-
menu = await db.execute(stmt)
68-
return menu.scalars().all()
65+
filters['id__in'] = menu_ids
66+
67+
return await self.select_models_order(db, 'sort', 'asc', **filters)
6968

7069
async def create(self, db: AsyncSession, obj: CreateMenuParam) -> None:
7170
"""
@@ -106,9 +105,7 @@ async def get_children(self, db: AsyncSession, menu_id: int) -> list[Menu | None
106105
:param menu_id: 菜单 ID
107106
:return:
108107
"""
109-
stmt = select(self.model).options(selectinload(self.model.children)).where(self.model.id == menu_id)
110-
result = await db.execute(stmt)
111-
menu = result.scalars().first()
108+
menu = await self.select_model(db, menu_id, load_strategies=['children'])
112109
return menu.children
113110

114111

backend/app/admin/crud/crud_opera_log.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ async def get_list(self, username: str | None, status: int | None, ip: str | Non
2121
:return:
2222
"""
2323
filters = {}
24+
2425
if username is not None:
25-
filters.update(username__like=f'%{username}%')
26+
filters['username__like'] = f'%{username}%'
2627
if status is not None:
27-
filters.update(status=status)
28+
filters['status__eq'] = status
2829
if ip is not None:
29-
filters.update(ip__like=f'%{ip}%')
30+
filters['ip__like'] = f'%{ip}%'
31+
3032
return await self.select_order('created_time', 'desc', **filters)
3133

3234
async def create(self, db: AsyncSession, obj: CreateOperaLogParam) -> None:

backend/app/admin/crud/crud_role.py

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5-
from sqlalchemy import Select, and_, desc, select
5+
from sqlalchemy import Select, select
66
from sqlalchemy.ext.asyncio import AsyncSession
7-
from sqlalchemy.orm import noload, selectinload
87
from sqlalchemy_crud_plus import CRUDPlus
98

109
from backend.app.admin.model import DataScope, Menu, Role
@@ -37,13 +36,7 @@ async def get_with_relation(self, db: AsyncSession, role_id: int) -> Role | None
3736
:param role_id: 角色 ID
3837
:return:
3938
"""
40-
stmt = (
41-
select(self.model)
42-
.options(selectinload(self.model.menus), selectinload(self.model.scopes))
43-
.where(self.model.id == role_id)
44-
)
45-
role = await db.execute(stmt)
46-
return role.scalars().first()
39+
return await self.select_model(db, role_id, load_strategies=['menus', 'scopes'])
4740

4841
async def get_all(self, db: AsyncSession) -> Sequence[Role]:
4942
"""
@@ -62,22 +55,23 @@ async def get_list(self, name: str | None, status: int | None) -> Select:
6255
:param status: 角色状态
6356
:return:
6457
"""
65-
stmt = (
66-
select(self.model)
67-
.options(noload(self.model.users), noload(self.model.menus), noload(self.model.scopes))
68-
.order_by(desc(self.model.created_time))
69-
)
7058

71-
filters = []
59+
filters = {}
60+
7261
if name is not None:
73-
filters.append(self.model.name.like(f'%{name}%'))
62+
filters['name__like'] = f'%{name}%'
7463
if status is not None:
75-
filters.append(self.model.status == status)
76-
77-
if filters:
78-
stmt = stmt.where(and_(*filters))
79-
80-
return stmt
64+
filters['status'] = status
65+
66+
return await self.select_order(
67+
'id',
68+
load_strategies={
69+
'users': 'noload',
70+
'menus': 'noload',
71+
'scopes': 'noload',
72+
},
73+
**filters,
74+
)
8175

8276
async def get_by_name(self, db: AsyncSession, name: str) -> Role | None:
8377
"""

backend/app/admin/crud/crud_user.py

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -*- coding: utf-8 -*-
33
import bcrypt
44

5-
from sqlalchemy import and_, desc, select
5+
from sqlalchemy import select
66
from sqlalchemy.ext.asyncio import AsyncSession
77
from sqlalchemy.orm import noload, selectinload
88
from sqlalchemy.sql import Select
@@ -171,29 +171,26 @@ async def get_list(self, dept: int | None, username: str | None, phone: str | No
171171
:param status: 用户状态
172172
:return:
173173
"""
174-
stmt = (
175-
select(self.model)
176-
.options(
177-
selectinload(self.model.dept).options(noload(Dept.parent), noload(Dept.children), noload(Dept.users)),
178-
selectinload(self.model.roles).options(noload(Role.users), noload(Role.menus), noload(Role.scopes)),
179-
)
180-
.order_by(desc(self.model.join_time))
181-
)
174+
filters = {}
182175

183-
filters = []
184176
if dept:
185-
filters.append(self.model.dept_id == dept)
177+
filters['dept_id'] = dept
186178
if username:
187-
filters.append(self.model.username.like(f'%{username}%'))
179+
filters['username__like'] = f'%{username}%'
188180
if phone:
189-
filters.append(self.model.phone.like(f'%{phone}%'))
181+
filters['phone_like'] = f'%{phone}%'
190182
if status is not None:
191-
filters.append(self.model.status == status)
183+
filters['status'] = status
192184

193-
if filters:
194-
stmt = stmt.where(and_(*filters))
195-
196-
return stmt
185+
return await self.select_order(
186+
'id',
187+
'desc',
188+
load_options=[
189+
selectinload(self.model.dept).options(noload(Dept.parent), noload(Dept.children), noload(Dept.users)),
190+
selectinload(self.model.roles).options(noload(Role.users), noload(Role.menus), noload(Role.scopes)),
191+
],
192+
**filters,
193+
)
197194

198195
async def get_super(self, db: AsyncSession, user_id: int) -> bool:
199196
"""
@@ -294,22 +291,19 @@ async def get_with_relation(
294291
:param username: 用户名
295292
:return:
296293
"""
297-
stmt = select(self.model).options(
298-
selectinload(self.model.dept),
299-
selectinload(self.model.roles).options(selectinload(Role.menus), selectinload(Role.scopes)),
300-
)
294+
filters = {}
301295

302-
filters = []
303296
if user_id:
304-
filters.append(self.model.id == user_id)
297+
filters['id'] = user_id
305298
if username:
306-
filters.append(self.model.username == username)
299+
filters['username'] = username
307300

308-
if filters:
309-
stmt = stmt.where(and_(*filters))
310-
311-
user = await db.execute(stmt)
312-
return user.scalars().first()
301+
return await self.select_model_by_column(
302+
db,
303+
load_options=[selectinload(self.model.roles).options(selectinload(Role.menus), selectinload(Role.scopes))],
304+
load_strategies=['dept'],
305+
**filters,
306+
)
313307

314308

315309
user_dao: CRUDUser = CRUDUser(User)

backend/plugin/config/crud/crud_config.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,12 @@ async def get_list(self, name: str | None, type: str | None) -> Select:
6464
:return:
6565
"""
6666
filters = {'type__not_in': settings.CONFIG_BUILT_IN_TYPES}
67+
6768
if name is not None:
68-
filters.update(name__like=f'%{name}%')
69+
filters['name__like'] = f'%{name}%'
6970
if type is not None:
70-
filters.update(type__like=f'%{type}%')
71+
filters['type__like'] = f'%{type}%'
72+
7173
return await self.select_order('created_time', 'desc', **filters)
7274

7375
async def create(self, db: AsyncSession, obj: CreateConfigParam) -> None:

0 commit comments

Comments
 (0)