All checks were successful
CI / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 7s
CI / openapi-codegen-check (pull_request) Successful in 3m10s
CI Trade-In / backend-tests (pull_request) Successful in 5m47s
CI / backend-tests (pull_request) Successful in 18m3s
Ключ шифрования кук и сами куки уезжали в GlitchTip: сервисы сессий передают их bind-параметрами в pgp_sym_encrypt(:cookies_json, :key), а SQLAlchemy при ошибке печатает ВСЕ параметры в тексте StatementError. Правка на уровне движка (backend + tradein-mvp: db.py, auth_db.py, alembic/env.py) кроет все сайты вызова разом, включая четвёртую копию в scraper-kit и всё будущее. scheduler_main.py был единственным из трёх sentry_sdk.init без include_local_variables=False — процесс скрейпера, в кадрах лежат прокси-креды. НЕ закрывает: текст ошибки самого драйвера (Postgres DETAIL со значением) и сырые psycopg-подключения мимо движков — отдельный класс. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
"""Alembic env. Loads DB URL from app settings, registers all SQLAlchemy
|
||
models so autogenerate can detect schema drift."""
|
||
|
||
from logging.config import fileConfig
|
||
|
||
from sqlalchemy import engine_from_config, pool
|
||
|
||
# Import the models package so every ORM model registers on Base.metadata.
|
||
# Add new model modules in app/models/__init__.py as they appear.
|
||
import app.models # noqa: F401
|
||
from alembic import context
|
||
from app.core.config import settings
|
||
from app.core.db import Base
|
||
|
||
config = context.config
|
||
|
||
# Inject runtime DB URL.
|
||
config.set_main_option("sqlalchemy.url", settings.database_url)
|
||
|
||
if config.config_file_name is not None:
|
||
fileConfig(config.config_file_name)
|
||
|
||
target_metadata = Base.metadata
|
||
|
||
|
||
def run_migrations_offline() -> None:
|
||
"""Generate SQL without a live DB connection."""
|
||
context.configure(
|
||
url=config.get_main_option("sqlalchemy.url"),
|
||
target_metadata=target_metadata,
|
||
literal_binds=True,
|
||
dialect_opts={"paramstyle": "named"},
|
||
compare_type=True,
|
||
compare_server_default=True,
|
||
)
|
||
with context.begin_transaction():
|
||
context.run_migrations()
|
||
|
||
|
||
def run_migrations_online() -> None:
|
||
"""Run migrations against a live DB."""
|
||
connectable = engine_from_config(
|
||
config.get_section(config.config_ini_section, {}),
|
||
prefix="sqlalchemy.",
|
||
poolclass=pool.NullPool,
|
||
# #3194: SQLAlchemy печатает ВСЕ bind-параметры в тексте StatementError.
|
||
# Миграции гоняют DDL/DML с литералами и параметрами из данных — флаг
|
||
# на уровне движка не даёт им уехать в GlitchTip.
|
||
# НЕ закрывает: текст ошибки самого драйвера (Postgres DETAIL со
|
||
# значением) и сырые psycopg-подключения мимо движков.
|
||
hide_parameters=True,
|
||
)
|
||
with connectable.connect() as connection:
|
||
context.configure(
|
||
connection=connection,
|
||
target_metadata=target_metadata,
|
||
compare_type=True,
|
||
compare_server_default=True,
|
||
)
|
||
with context.begin_transaction():
|
||
context.run_migrations()
|
||
|
||
|
||
if context.is_offline_mode():
|
||
run_migrations_offline()
|
||
else:
|
||
run_migrations_online()
|