sageapi/scripts/generate_ddl.py
Hermes Agent acb9674375 feat: CRUD definitions, build script, DDL generation
- 3 CRUD JSON files: customer_balance, accounting_records, sync_state
- Build script with model validation, CRUD validation, DDL generation
- DDL: db/schema.sql (72 lines, 7 tables)
- Scripts: validate_models.py, validate_crud.py, generate_ddl.py
2026-05-20 18:28:59 +08:00

56 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python3
"""Generate DDL from SageAPI model JSON definitions."""
import json
import os
def generate_ddl(models_dir='models', output_path='db/schema.sql'):
os.makedirs(os.path.dirname(output_path), exist_ok=True)
ddl_lines = ['-- SageAPI DDL (auto-generated)', '']
for f in sorted(os.listdir(models_dir)):
if not f.endswith('.json'):
continue
with open(os.path.join(models_dir, f)) as fh:
data = json.load(fh)
summary = data['summary'][0]
tblname = summary['name']
primary = summary['primary']
btick = '`'
ddl_lines.append(f'CREATE TABLE IF NOT EXISTS {btick}{tblname}{btick} (')
col_defs = []
for field in data['fields']:
nullable = 'NULL' if field.get('nullable', True) else 'NOT NULL'
default = ''
if field.get('default') is not None:
if isinstance(field['default'], str) and field['default'] not in ('CURRENT_TIMESTAMP', 'NULL', ''):
default = f"DEFAULT '{field['default']}'"
else:
default = f"DEFAULT {field['default']}"
comment = f"COMMENT '{field.get('comment', '')}'"
fname = f'{btick}{field["name"]}{btick}'
col_defs.append(f' {fname} {field["type"]} {nullable} {default} {comment}'.strip())
pk = f'{btick}{primary}{btick}'
col_defs.append(f' PRIMARY KEY ({pk})')
ddl_lines.append(',\n'.join(col_defs))
ddl_lines.append(') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;')
ddl_lines.append('')
tbl = f'{btick}{tblname}{btick}'
for idx in data.get('idxfields', []):
unique = 'UNIQUE' if idx.get('unique') else 'INDEX'
cols = ','.join(f'{btick}{c}{btick}' for c in idx['fields'])
idx_name = f'{btick}{idx["name"]}{btick}'
ddl_lines.append(f'ALTER TABLE {tbl} ADD {unique} {idx_name} ({cols});')
ddl_lines.append('')
with open(output_path, 'w') as fh:
fh.write('\n'.join(ddl_lines))
print(f' Generated: {output_path} ({len(ddl_lines)} lines)')
if __name__ == '__main__':
generate_ddl()