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:
bwstudio
2026-09-06 21:34:37 +08:00
parent 05f1ac6a00
commit 0bfe6f9d8c
+13 -4
View File
@@ -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}")