Skip to content

【Bug】导入自定义 SQL 字典时,若存在多个二级分类,只有最后一个会被保留 #61

@Haiso168

Description

@Haiso168

📝 Issue Description (问题描述)
在插件前端界面使用“上传 SQL 数据”导入自定义字典时,如果导入的 SQL 文件内部存在多个一级分类 (tag_groups) 或二级分类 (tag_subgroups),导入系统只能识别并保留文件中的最后一个分类,其他分类会被直接丢弃。
这导致了在导入例如“碧蓝档案角色”这种按学校(多个二级分类)划分的词库时,所有分类结构丢失,只剩下最后一个学校(在这个案例中是“其他角色”)。

🔍 Steps to Reproduce (复现步骤)
准备一个结构正常的包含多个 tag_subgroups (多个二级分类)INSERT语句的 SQL 字典文件。
打开 WeiLin 插件的 Tag 管理界面,点击“导入 Tag 数据” -> “上传 SQL 数据”。
选择该 SQL 文件导入。
在预览窗口中观察,或者点击“确认导入”后去后台查看,会发现该字典只成功导入了 SQL 文件最底部的那最后一个二级分类,其余中间的二级分类全部不翼而飞。
💻 Root Cause Analysis (源码层面的原因定位)
问题出在前端解析上传 SQL 文件的 Vue 组件中。 文件路径:
src/src/view/tag_manager/import_tag.vue
函数:
handleFileUpload(event)
在解析以 ; 分割的 SQL 语句时(约在代码第 258 行):
javascript
sqlStatements.forEach(statement => {
if ((statement.includes('tag_groups') || statement.includes('tag_subgroups')) && statement.includes('p_uuid')) {
if (statement.includes('g_uuid')) {
// 处理二级分类
subGroupSql.value = statement + ';'; // 🚨 BUG: 这里直接进行了字符串赋值覆盖
// ...提取 uuid 的逻辑
} else {
// 处理一级分类
groupSql.value = statement + ';'; // 🚨 BUG: 这里同样进行了赋值覆盖
// ...提取 uuid 的逻辑
}
} else if (statement.includes('tag_tags')) {
tagGroups.value.push(statement + ';'); // tag 标签由于是数组 push() 所以能全部保留
}
});
由于 subGroupSql 和 groupSql 均为单一的字符串引用 (ref(''))。在对 sqlStatements 数组进行 forEach 循环遍历时,每遇到一条新的分类插入语句,就会直接将旧的语句完全覆盖。
当 forEach 循环结束时,subGroupSql.value 里只存放了文本中最后一条二级分类的 INSERT 语句。导致在调用sureToImportTags()发送网络请求给后端时,缺失了大量数据。

🛠️ Proposed Solution (修复建议)
建议不要使用单一的 String 变量来存放组分类 SQL,而是将 groupSql 和 subGroupSql 也修改为像 tagGroups 同样的数组 ref([]),使用 push() 方式追加语句。

并在最终组合提交给后端时:

javascript
const sqlContent = [...groupSql.value, ...subGroupSql.value, ...tagGroups.value]
await runSQLToServer(sqlContent)
这样不仅能完美支持批量导入庞大且分类复杂的字典层级,还能省去用户手动切分多个独立 SQL 然后逐个导入的麻烦。

下面是两个供测试的文件,第二个可以导入,但需要手动设置一级、二级分类(随意),导入后再删除。

Blue Archive Characters.sql
Blue Archive Characters_Hacked_For_Import.sql

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions