From 16ec78beae15c789cc345bcd0c16af280ce8db27 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Fri, 3 Jul 2026 10:05:38 -0600 Subject: [PATCH] =?UTF-8?q?feat:=20SQL=20=E6=8F=90=E4=BA=A4=E5=89=8D?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=A0=BC=E5=BC=8F=E5=8C=96=EF=BC=88sqlparse?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - format_code 新增 sql 分支,reindent + 关键字大写 - FormatCodeSerializer 的 language choices 加入 sql Co-Authored-By: Claude Fable 5 --- submission/serializers.py | 2 +- submission/utils.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/submission/serializers.py b/submission/serializers.py index 913da55..c146e00 100644 --- a/submission/serializers.py +++ b/submission/serializers.py @@ -123,4 +123,4 @@ class SubmissionListSerializer(serializers.ModelSerializer): class FormatCodeSerializer(serializers.Serializer): code = serializers.CharField(max_length=1024 * 1024) - language = serializers.ChoiceField(choices=("python", "c", "cpp")) + language = serializers.ChoiceField(choices=("python", "c", "cpp", "sql")) diff --git a/submission/utils.py b/submission/utils.py index f7792b2..c12d79c 100644 --- a/submission/utils.py +++ b/submission/utils.py @@ -1,5 +1,7 @@ import subprocess +import sqlparse + CLANG_FORMAT_STYLE = "{BasedOnStyle: LLVM, IndentWidth: 4, BreakBeforeBraces: Attach}" @@ -14,16 +16,23 @@ class FormatToolError(Exception): def format_code(code, language): """ :param code: 用户代码 - :param language: "python" | "c" | "cpp" + :param language: "python" | "c" | "cpp" | "sql" :return: 格式化后的代码字符串 :raises FormatSyntaxError: 代码语法错误导致格式化失败(仅 python) :raises FormatToolError: 格式化工具本身执行失败 """ if language == "python": return _format_with_ruff(code) + if language == "sql": + return _format_with_sql(code) return _format_with_clang(code, language) +def _format_with_sql(code): + # sqlparse 对语法错误宽容,不会抛异常,语法问题留给判题阶段反馈 + return sqlparse.format(code, reindent=True, keyword_case="upper") + + def _format_with_ruff(code): try: result = subprocess.run(