diff --git a/bd/tables/response.py b/bd/tables/response.py index 41e4daa..e410a84 100644 --- a/bd/tables/response.py +++ b/bd/tables/response.py @@ -11,7 +11,7 @@ class Response(Base): id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) poll_id = Column(UUID(as_uuid=True), ForeignKey("polls.id", ondelete="CASCADE"), nullable=False) - user_id = Column(UUID(as_uuid=True), nullable=True) + user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=True) # Снимок группы и организации пользователя на момент прохождения group_id = Column(UUID(as_uuid=True), nullable=True) organization_id = Column(UUID(as_uuid=True), nullable=True) diff --git a/route/init_data_base.py b/route/init_data_base.py index 4e553a2..5542382 100644 --- a/route/init_data_base.py +++ b/route/init_data_base.py @@ -70,6 +70,30 @@ async def create_tables(): raise HTTPException(status_code=500, detail=str(e)) +@router.post("/db/migrate-cascade-user", dependencies=[Depends(require_admin_key)]) +async def migrate_cascade_user(): + """Добавляет FK responses.user_id → users.id ON DELETE CASCADE, если ещё не существует.""" + engine = make_engine() + try: + with engine.connect() as conn: + conn.execute(text(""" + DO $$ BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_constraint + WHERE conname = 'responses_user_id_fkey' + ) THEN + ALTER TABLE responses + ADD CONSTRAINT responses_user_id_fkey + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; + END IF; + END $$; + """)) + conn.commit() + return {"status": "ok", "detail": "FK responses.user_id → users(id) ON DELETE CASCADE ensured"} + except SQLAlchemyError as e: + raise HTTPException(status_code=500, detail=str(e)) + + @router.post("/db/migrate-users", dependencies=[Depends(require_admin_key)]) async def migrate_users(): """Добавляет колонки username и hashed_password в таблицу users, если они ещё не существуют."""