handle() → run_sql() (sql_runner.py, entrypoint: sql_runner.run_sql) handle() → crud() (notes_crud.py, entrypoint: notes_crud.crud) handle() → list_notes() (notes_list.py, entrypoint: notes_list.list_notes)
40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
# 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()
|