- 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
56 lines
2.1 KiB
Python
Executable File
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()
|