fix(json2ddl): normalize field.default before render to fix illegal DEFAULT ''N'' SQL
This commit is contained in:
parent
cdb5db57f3
commit
ad8f6c926f
@ -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]
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user