fix(script): admin init 重复插入种子导航,改为按 url 幂等去重
原 nav 导入条件 `if not Nav.query.get(id) if id else True` 对无 id 的种子项 永远为 True,导致每次容器启动 flask admin init 都重复插入 54 条种子导航, 与真实数据叠加产生重复。改为按 id 或 url 去重,已存在则跳过。
This commit is contained in:
@@ -137,14 +137,23 @@ def import_logic(file_path, is_force):
|
||||
user.role = roles
|
||||
db.session.commit()
|
||||
|
||||
# 5. 导入公开导航(Nav 表)
|
||||
# 5. 导入公开导航(Nav 表)—— 幂等:按 id 或 url 去重,避免每次启动重复插入
|
||||
from applications.models import Nav
|
||||
count_nav = 0
|
||||
existing_urls = {row[0] for row in db.session.query(Nav.url).all()}
|
||||
for item in raw_data.get("navs", []):
|
||||
item = parse_time(item)
|
||||
if not Nav.query.get(item.get('id')) if item.get('id') else True:
|
||||
db.session.add(Nav(**item))
|
||||
count_nav += 1
|
||||
# 已存在相同主键 id 则跳过
|
||||
if item.get("id") and Nav.query.get(item["id"]):
|
||||
continue
|
||||
# 已存在相同 url 则跳过(典型场景:用户真实导航已覆盖种子数据,避免重复)
|
||||
url = item.get("url")
|
||||
if url and url in existing_urls:
|
||||
continue
|
||||
db.session.add(Nav(**item))
|
||||
count_nav += 1
|
||||
if url:
|
||||
existing_urls.add(url)
|
||||
db.session.commit()
|
||||
|
||||
click.echo(f"导入成功! 新增: 部门{count_dept}, 权限{count_power}, 角色{count_role}, 用户{count_user}, 导航{count_nav}")
|
||||
|
||||
Reference in New Issue
Block a user