#!/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: d = field['default'] if d == 'CURRENT_TIMESTAMP': default = "DEFAULT CURRENT_TIMESTAMP" elif d == '': default = "DEFAULT ''" elif isinstance(d, str): default = f"DEFAULT '{d}'" else: default = f"DEFAULT {d}" 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()