Skip to content

Commit fb07032

Browse files
authored
Fix relational insertion error for empty lists (fastapi-practices#1056)
1 parent 75e9842 commit fb07032

4 files changed

Lines changed: 43 additions & 28 deletions

File tree

backend/app/admin/crud/crud_data_scope.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,13 @@ async def update_rules(db: AsyncSession, pk: int, rule_ids: UpdateDataScopeRuleP
117117
data_scope_rule_stmt = delete(data_scope_rule).where(data_scope_rule.c.data_scope_id == pk)
118118
await db.execute(data_scope_rule_stmt)
119119

120-
data_scope_rule_data = [
121-
CreateDataScopeRuleParam(data_scope_id=pk, data_rule_id=rule_id).model_dump() for rule_id in rule_ids.rules
122-
]
123-
data_scope_rule_stmt = insert(data_scope_rule)
124-
await db.execute(data_scope_rule_stmt, data_scope_rule_data)
120+
if rule_ids.rules:
121+
data_scope_rule_data = [
122+
CreateDataScopeRuleParam(data_scope_id=pk, data_rule_id=rule_id).model_dump()
123+
for rule_id in rule_ids.rules
124+
]
125+
data_scope_rule_stmt = insert(data_scope_rule)
126+
await db.execute(data_scope_rule_stmt, data_scope_rule_data)
125127

126128
return len(rule_ids.rules)
127129

backend/app/admin/crud/crud_role.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,12 @@ async def update_menus(db: AsyncSession, role_id: int, menu_ids: UpdateRoleMenuP
135135
role_menu_stmt = delete(role_menu).where(role_menu.c.role_id == role_id)
136136
await db.execute(role_menu_stmt)
137137

138-
role_menu_data = [
139-
CreateRoleMenuParam(role_id=role_id, menu_id=menu_id).model_dump() for menu_id in menu_ids.menus
140-
]
141-
role_menu_stmt = insert(role_menu)
142-
await db.execute(role_menu_stmt, role_menu_data)
138+
if menu_ids.menus:
139+
role_menu_data = [
140+
CreateRoleMenuParam(role_id=role_id, menu_id=menu_id).model_dump() for menu_id in menu_ids.menus
141+
]
142+
role_menu_stmt = insert(role_menu)
143+
await db.execute(role_menu_stmt, role_menu_data)
143144

144145
return len(menu_ids.menus)
145146

@@ -156,11 +157,13 @@ async def update_scopes(db: AsyncSession, role_id: int, scope_ids: UpdateRoleSco
156157
role_scope_stmt = delete(role_data_scope).where(role_data_scope.c.role_id == role_id)
157158
await db.execute(role_scope_stmt)
158159

159-
role_scope_data = [
160-
CreateRoleScopeParam(role_id=role_id, data_scope_id=scope_id).model_dump() for scope_id in scope_ids.scopes
161-
]
162-
role_scope_stmt = insert(role_data_scope)
163-
await db.execute(role_scope_stmt, role_scope_data)
160+
if scope_ids.scopes:
161+
role_scope_data = [
162+
CreateRoleScopeParam(role_id=role_id, data_scope_id=scope_id).model_dump()
163+
for scope_id in scope_ids.scopes
164+
]
165+
role_scope_stmt = insert(role_data_scope)
166+
await db.execute(role_scope_stmt, role_scope_data)
164167

165168
return len(scope_ids.scopes)
166169

backend/app/admin/crud/crud_user.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,14 @@ async def add(self, db: AsyncSession, obj: AddUserParam) -> None:
122122
db.add(new_user)
123123
await db.flush()
124124

125-
role_stmt = select(Role).where(Role.id.in_(obj.roles))
126-
result = await db.execute(role_stmt)
127-
roles = result.scalars().all()
125+
if obj.roles:
126+
role_stmt = select(Role).where(Role.id.in_(obj.roles))
127+
result = await db.execute(role_stmt)
128+
roles = result.scalars().all()
128129

129-
user_role_data = [AddUserRoleParam(user_id=new_user.id, role_id=role.id).model_dump() for role in roles]
130-
user_role_stmt = insert(user_role)
131-
await db.execute(user_role_stmt, user_role_data)
130+
user_role_data = [AddUserRoleParam(user_id=new_user.id, role_id=role.id).model_dump() for role in roles]
131+
user_role_stmt = insert(user_role)
132+
await db.execute(user_role_stmt, user_role_data)
132133

133134
async def add_by_oauth2(self, db: AsyncSession, obj: AddOAuth2UserParam) -> None:
134135
"""
@@ -165,16 +166,17 @@ async def update(self, db: AsyncSession, user_id: int, obj: UpdateUserParam) ->
165166

166167
count = await self.update_model(db, user_id, obj)
167168

168-
role_stmt = select(Role).where(Role.id.in_(role_ids))
169-
result = await db.execute(role_stmt)
170-
roles = result.scalars().all()
171-
172169
user_role_stmt = delete(user_role).where(user_role.c.user_id == user_id)
173170
await db.execute(user_role_stmt)
174171

175-
user_role_data = [AddUserRoleParam(user_id=user_id, role_id=role.id).model_dump() for role in roles]
176-
user_role_stmt = insert(user_role)
177-
await db.execute(user_role_stmt, user_role_data)
172+
if role_ids:
173+
role_stmt = select(Role).where(Role.id.in_(role_ids))
174+
result = await db.execute(role_stmt)
175+
roles = result.scalars().all()
176+
177+
user_role_data = [AddUserRoleParam(user_id=user_id, role_id=role.id).model_dump() for role in roles]
178+
user_role_stmt = insert(user_role)
179+
await db.execute(user_role_stmt, user_role_data)
178180

179181
return count
180182

backend/app/admin/service/data_scope_service.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from sqlalchemy.ext.asyncio import AsyncSession
55

6+
from backend.app.admin.crud.crud_data_rule import data_rule_dao
67
from backend.app.admin.crud.crud_data_scope import data_scope_dao
78
from backend.app.admin.model import DataScope
89
from backend.app.admin.schema.data_scope import (
@@ -117,6 +118,13 @@ async def update_data_scope_rule(*, db: AsyncSession, pk: int, rule_ids: UpdateD
117118
:param rule_ids: 规则 ID 列表
118119
:return:
119120
"""
121+
data_scope = await data_scope_dao.get(db, pk)
122+
if not data_scope:
123+
raise errors.NotFoundError(msg='数据范围不存在')
124+
for rule_id in rule_ids.rules:
125+
rule = await data_rule_dao.get(db, rule_id)
126+
if not rule:
127+
raise errors.NotFoundError(msg='数据规则不存在')
120128
count = await data_scope_dao.update_rules(db, pk, rule_ids)
121129
await user_cache_manager.clear_by_data_scope_id(db, [pk])
122130
return count

0 commit comments

Comments
 (0)