# 2026-03-09 # sql_runner.py — универсальный DDL/SQL исполнитель. # # Назначение: выполнять произвольные SQL запросы переданные через event. # Используется ТОЛЬКО через sless_job (init.tf) — HTTP-триггера нет намеренно, # чтобы никто снаружи не мог выполнить произвольный SQL. # # Входящий event: # { # "statements": [ # "CREATE TABLE IF NOT EXISTS ...", # "CREATE INDEX IF NOT EXISTS ..." # ] # } # # Все statements выполняются последовательно в одной транзакции. # Если хотя бы один упал — транзакция откатывается целиком. import os import psycopg2 def run_sql(event): dsn = os.environ['PG_DSN'] statements = event.get('statements', []) if not statements: return {'error': 'no statements provided'} conn = psycopg2.connect(dsn) try: cur = conn.cursor() for sql in statements: cur.execute(sql) conn.commit() return {'ok': True, 'executed': len(statements)} except Exception as e: conn.rollback() return {'error': str(e)} finally: conn.close()