fix(json2ddl): normalize field.default before render to fix illegal DEFAULT ''N'' SQL

This commit is contained in:
yumoqing 2026-09-08 15:24:16 +08:00
parent cdb5db57f3
commit ad8f6c926f

View File

@ -22,6 +22,29 @@ tmpls = {
"postgresql":postgresql_ddl_tmpl "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): def xls2ddl(xlsfile,dbtype):
data = None data = None
if xlsfile.endswith('.json'): if xlsfile.endswith('.json'):
@ -34,6 +57,7 @@ def xls2ddl(xlsfile,dbtype):
if data is None: if data is None:
print(xlsfile, 'not data return') print(xlsfile, 'not data return')
return return
normalize_defaults(data)
pri = data['summary'][0]['primary'] pri = data['summary'][0]['primary']
if isinstance(pri, str): if isinstance(pri, str):
data['summary'][0]['primary'] = [pri] data['summary'][0]['primary'] = [pri]