一、整理mapper文件列表(用作后续处理的任务列表)
项目 列出每个子目录中的全部mapper文件 编写为 全部mapper列表.json 包含字段,项目目录名、相对路径、sql语句数
二、将以上文件列表拆分(作为量级更小的任务列表)
全部mapper列表.json 将列表,按每5个拆分,保存到 tasks
三、首次提示词:
充分理解 @orig/shardingsphere-5.3.2/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario 中的加解密改写逻辑、mockSchema、加密配置。复用或新编写改写程序,实现:输入原始sql,输出改写sql。
将@tasks/mapper_list_1.json 中的每个mapper文件,完全要提交给大模型,理解出每句实现提交执行的sql。
牢记不要使用脚本解析 mapper XML 文件,提交给大模型理解后得到sql。
当涉及到敏感字段(手机号、银行卡号、身份证号)时,在改写程序中补充mockSchema、加密配置。
使用改写程序输出改写后语句。
如果执行错误(未得到输出语句),仔细确认是否输入原始sql格式错误(进行改正后,重新执行改写,可多次尝试);如果确实属于shardingsphere逻辑错误,追加记录到 tasks/error.json ({"项目目录名": "","相对路径": ".xml","id": "","inputSql": "","inputParams": "","errorDesc": ""})
判断存在敏感字段时,输出改写sql是否满足:1、插入、更新时密文、明文双写;2、FROM派生表子查询中,展开为密文+明文;3、投影列中的敏感字段改写为密文字段并指定回别名;4、select *需要展开为元数据中的字段(mock schema位于@orig/shardingsphere-5.3.2/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/EncryptSQLRewriterIT.java *需要展开 或者 语句中存在未写owner的字段未成功改写时 要使用mock schema,缺少时补充。其它不需要mock schema时,可以不写mock schema);5、加密字段配置位于@orig/shardingsphere-5.3.2/test/it/rewriter/src/test/resources/scenario/encrypt/config/encrypt-project-full.yaml 需要指定plainColumn、cipherColumn字段,其它辅助查询字段不使用,如果存在敏感字段的表没有配置加密规则要补充配置;6、除双写、FROM派生表子查询外,改写后的语句中不得再出现敏感字段明文列。
牢记不要编写程序判断输出sql满足以上规则,提交给大模型理解后判断。
如果由于mockSchema、加密配置导致不满足以上期望结果,修改mockSchema、加密配置(进行改正后,重新执行改写,可多次尝试);如果确实属于shardingsphere逻辑原因无法达到期望输出,追加记录到tasks/failures.json ({"项目目录名": "","相对路径": ".xml","id": "","inputSql": "","inputParams": "","outputSql": "","outputParams": "","failureDesc":"描述不满足期望的类型"})。
得到输出改写sql后,追加记录到tasks/out_{mapper_list_序号}.json ({"项目目录名": "","相对路径": ".xml","id": "","inputSql": "","inputParams": "","outputSql": "","outputParams": ""})。
将上下文的关键的信息、任务经验,编写到 tasks/summary.md 用于后续任务参照。
变更文件提交git(只在task目录提交即可)
四-1、后续提示词(使用cli工具(如qodercli)批量执行)
充分理解 @tasks/session-summary.md 将@tasks/mapper_list_389.json 中的每个mapper文件,完全要提交给大模型,理解出每句实现提交执行的sql。
牢记不要使用脚本解析 mapper XML 文件,提交给大模型理解后得到sql。
当涉及到敏感字段(手机号、银行卡号、身份证号)时,在改写程序中补充mockSchema、加密配置。
使用改写程序输出改写后语句。
如果执行错误(未得到输出语句),仔细确认是否输入原始sql格式错误(进行改正后,重新执行改写,可多次尝试);如果确实属于shardingsphere逻辑错误,追加记录到 tasks/error.json ({"项目目录名": "","相对路径": ".xml","id": "","inputSql": "","inputParams": "","errorDesc": ""})
判断存在敏感字段时,输出改写sql是否满足:1、插入、更新时密文、明文双写;2、FROM派生表子查询中,展开为密文+明文;3、投影列中的敏感字段改写为密文字段并指定回别名;4、select *需要展开为元数据中的字段(mock schema位于@orig/shardingsphere-5.3.2/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/EncryptSQLRewriterIT.java *需要展开 或者 语句中存在未写owner的字段未成功改写时 要使用mock schema,缺少时补充。其它不需要mock schema时,可以不写mock schema);5、加密字段配置位于@orig/shardingsphere-5.3.2/test/it/rewriter/src/test/resources/scenario/encrypt/config/encrypt-project-full.yaml 需要指定plainColumn、cipherColumn字段,其它辅助查询字段不使用,如果存在敏感字段的表没有配置加密规则要补充配置;6、除双写、FROM派生表子查询外,改写后的语句中不得再出现敏感字段明文列。
牢记不要编写程序判断输出sql满足以上规则,提交给大模型理解后判断。
如果由于mockSchema、加密配置导致不满足以上期望结果,修改mockSchema、加密配置(进行改正后,重新执行改写,可多次尝试);如果确实属于shardingsphere逻辑原因无法达到期望输出,追加记录到tasks/failures.json ({"项目目录名": "","相对路径": ".xml","id": "","inputSql": "","inputParams": "","outputSql": "","outputParams": "","failureDesc":"描述不满足期望的类型"})。
得到输出改写sql后,追加记录到tasks/out_{mapper_list_序号}.json ({"项目目录名": "","相对路径": ".xml","id": "","inputSql": "","inputParams": "","outputSql": "","outputParams": ""})。
如果存在十分关键的上下文的关键的信息、任务经验,编写到 tasks/summary_{序号}.md
变更文件提交git(只在tasks目录提交即可)
四-2、率先处理已知不支持语句mapper
未能测试出不支持用法"INSERT...SELECT 中的 SELECT 部分带有外层括号"
"inputSql": "INSERT INTO LNSSIGNAGREEMENTINFO (CONTRACTNO, ACCTNO, BANKID, SIGNCHANNEL, DEDUCTAGREEMENTNO, USEFLAG, SIGNMOBILE) SELECT ?, ?, ?, ?, ?, ?, ? FROM dual"
"outputSql": "INSERT INTO LNSSIGNAGREEMENTINFO (CONTRACTNO, ACCTNO_CIPHER, ACCTNO, BANKID, SIGNCHANNEL, DEDUCTAGREEMENTNO, USEFLAG, SIGNMOBILE_CIPHER, SIGNMOBILE) SELECT ?, ?, ?, ?, ?, ?, ? FROM dual"
<insert id="insertClientSignInfo" parameterType="java.util.List">
INSERT INTO LNSSIGNAGREEMENTINFO(CONTRACTNO,ACCTNO,BANKID,SIGNCHANNEL,DEDUCTAGREEMENTNO,USEFLAG,SIGNMOBILE)
<foreach close=")" index="index" open="(" collection="list" item="item" separator ="union all">
select
#{item.contractno},
#{item.acctno},
#{item.bankid},
#{item.signchannel},
#{item.deductagreementno},
#{item.useflag},
#{item.signmobile}
from dual
</foreach>
</insert>
未能测试出不支持用法 "函数包裹加密列"
{"项目目录名": "dfbg-china-back-end-user-growth-microcredit", "相对路径": "microcredit-core/src/main/resources/mapper/UserMd5DOMapper.xml", "id": "updatePhoneIdNoMd5ByPK", "inputSql": "UPDATE user_md5 SET phone_id_no_md5 = (SELECT MD5(CONCAT(IFNULL(u.phone,''), IFNULL(u.identity_id,''))) FROM users u WHERE u.id = user_md5.user_id) WHERE id = ?", "inputParams": "1", "outputSql": "UPDATE user_md5 SET phone_id_no_md5 = (SELECT MD5(CONCAT(IFNULL(u.phone,''), IFNULL(u.identity_id,''))) FROM users u WHERE u.id = user_md5.user_id) WHERE id = ?", "outputParams": "1"},
已知不支持用例:
227 InsSignAgreementInfoMapper INSERT...SELECT 中的 SELECT 部分带有外层括号 "INSERT...SELECT双写不完整:密文列已加入插入列表,但SELECT子句未同步扩展加密参数,导致插入列数(9)与SELECT参数(7)不匹配"
780 BossUserMapper like errors:UnsupportedEncryptSQLException: The SQL clause LIKE is unsupported in encrypt rule.
860 ZZZUserAgreementRecordDOMapper rlike "SQLParsingException: You have an error in your SQL syntax: SELECT MAX(id) FROM zzz_user_agreement_record WHERE user_id = ? AND project_code RLIKE '20|99
' AND trans_id IS NOT NULL GROUP BY fund_provided, no viable alternative at input 'RLIKE' at line 1, position 81, near [@13,81:85='RLIKE',<593>,1:81]"
316 HnxdApplysRejectedDOMapper UNION "UNION查询中第二个SELECT(mil_applys)的card_no未改写为密文列card_no_cipher,属于ShardingSphere逻辑限制"
844 UserMd5DOMapper 函数包裹加密列
250 YbdDeductStatusMapper distinct 加密列 "StringIndexOutOfBoundsException: String index out of range: -7"
五、后续提示词
/ralph-loop:ralph-loop '充分理解 @tasks/session-summary.md 将@tasks/mapper_list_{序号}.json 中的每个mapper文件,完全要提交给大模型,理解出每句实现提交执行的sql。(已经存在 summary_{序号}.md 或 out_{mapper_list_序号}.json代表已执行过,无需重复)
牢记不要使用脚本解析 mapper XML 文件,提交给大模型理解后得到sql。
当涉及到敏感字段(手机号、银行卡号、身份证号)时,在改写程序中补充mockSchema、加密配置。
使用改写程序输出改写后语句。
如果执行错误(未得到输出语句),仔细确认是否输入原始sql格式错误(进行改正后,重新执行改写,可多次尝试);如果确实属于shardingsphere逻辑错误,追加记录到 tasks/error.json ({"项目目录名": "","相对路径": ".xml","id": "","inputSql": "","inputParams": "","errorDesc": ""})
判断存在敏感字段时,输出改写sql是否满足:1、插入、更新时密文、明文双写;2、FROM派生表子查询中,展开为密文+明文;3、投影列中的敏感字段改写为密文字段并指定回别名;4、select *需要展开为元数据中的字段(mock schema位于@orig/shardingsphere-5.3.2/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/EncryptSQLRewriterIT.java *需要展开 或者 语句中存在未写owner的字段未成功改写时 要使用mock schema,缺少时补充。其它不需要mock schema时,可以不写mock schema);5、加密字段配置位于@orig/shardingsphere-5.3.2/test/it/rewriter/src/test/resources/scenario/encrypt/config/encrypt-project-full.yaml 需要指定plainColumn、cipherColumn字段,其它辅助查询字段不使用,如果存在敏感字段的表没有配置加密规则要补充配置;6、除双写、FROM派生表子查询外,改写后的语句中不得再出现敏感字段明文列。
牢记不要编写程序判断输出sql满足以上规则,提交给大模型理解后判断。
如果由于mockSchema、加密配置导致不满足以上期望结果,修改mockSchema、加密配置(进行改正后,重新执行改写,可多次尝试);如果确实属于shardingsphere逻辑原因无法达到期望输出,追加记录到tasks/failures.json ({"项目目录名": "","相对路径": ".xml","id": "","inputSql": "","inputParams": "","outputSql": "","outputParams": "","failureDesc":"描述不满足期望的类型"})。
得到输出改写sql后,追加记录到tasks/out_{mapper_list_序号}.json ({"项目目录名": "","相对路径": ".xml","id": "","inputSql": "","inputParams": "","outputSql": "","outputParams": ""})。
如果存在十分关键的上下文的关键的信息、任务经验,编写到 tasks/summary_{序号}.md
每处理完一份mapper_list_{序号}.json,变更文件提交git(只在tasks目录提交即可)' --completion-promise "DONE" --max-iterations 0
问题作为汇总文件的failures.json、error.json常常被清空
常常发生大模型未正确解读mapper,输入sql产生SQLParsingException、IndexOutOfBoundsException等异常,未能验证改写
任务列表中有多个mapper文件,只处理了一个mapper文件或者一语sql,后就作为完成
模型自行改用py程序,直接解析出简短语句,与mapper文件中的语句不相符。