diff --git a/xls2ddl/json2ddl.py b/xls2ddl/json2ddl.py index 69fe454..4374a2c 100644 --- a/xls2ddl/json2ddl.py +++ b/xls2ddl/json2ddl.py @@ -22,6 +22,29 @@ tmpls = { "postgresql":postgresql_ddl_tmpl } +def normalize_defaults(data): + """规范化字段 default 值(2026-09-07 根治 DEFAULT ''N'' 缺陷)。 + + DDL 模板的 defaultValue 宏固定输出 DEFAULT '<值>'(模板加引号),因此 JSON 里的 + default 必须是裸值。历史 models JSON 有两种脏形态,渲染出非法 SQL: + ① 自带外层单引号 "'active'" → DEFAULT ''active''(语法错误,整表建表中止) + ② 数值型 0(JSON number)→ Jinja {%- if defaultv %} 对 0 为假 → DEFAULT 子句静默丢失 + 统一在渲染前修数据(不动 sqlor 受保护模板,一处修复覆盖所有方言模板): + - 非字符串 default 转字符串(0 → '0',模板输出 DEFAULT '0',MySQL 数值列接受) + - 剥离外层成对单引号(多层也只剥到裸值) + - 内部残留单引号转义为 ''(SQL 字符串转义,防拼接断裂) + """ + for f in data.get('fields', []): + dv = f.get('default') + if dv is None: + continue + if not isinstance(dv, str): + dv = str(dv) + dv = dv.strip() + while len(dv) >= 2 and dv.startswith("'") and dv.endswith("'"): + dv = dv[1:-1] + f['default'] = dv.replace("'", "''") + def xls2ddl(xlsfile,dbtype): data = None if xlsfile.endswith('.json'): @@ -34,6 +57,7 @@ def xls2ddl(xlsfile,dbtype): if data is None: print(xlsfile, 'not data return') return + normalize_defaults(data) pri = data['summary'][0]['primary'] if isinstance(pri, str): data['summary'][0]['primary'] = [pri]