from contextlib import asynccontextmanager # ДОБАВЬТЕ ЭТОТ ИМПОРТ! from fastapi import FastAPI, Depends from sqlalchemy.orm import Session from sqlalchemy import text from .database import engine, Base, get_db from .models import * from .routers import unloadings, products from .admin import setup_admin @asynccontextmanager async def lifespan(app: FastAPI): # Создание таблиц при старте Base.metadata.create_all(bind=engine) # Создание триггера # Создание триггера from sqlalchemy import text with engine.begin() as conn: conn.execute(text(""" CREATE TRIGGER IF NOT EXISTS insert_product_from_unloading AFTER INSERT ON unloading FOR EACH ROW WHEN NOT EXISTS (SELECT 1 FROM product WHERE guid = NEW.guid) BEGIN INSERT INTO product (guid, name) VALUES (NEW.guid, NEW.name); -- Обновляем product_guid после создания продукта UPDATE unloading SET product_guid = NEW.guid WHERE guid = NEW.guid; END; """)) yield # Очистка при завершении pass app = FastAPI( title="Unloading System API", description="Система управления выгрузками и продуктами", version="1.0.0", lifespan=lifespan ) # Настройка админки admin = setup_admin(app) # Подключение роутеров app.include_router(unloadings.router) app.include_router(products.router) @app.get("/") async def root(): return { "message": "Unloading System API", "docs": "/docs", "admin": "/admin" } @app.get("/test-db") def test_db(db: Session = Depends(get_db)): from sqlalchemy import text result = db.execute(text("SELECT name FROM sqlite_master WHERE type='table'")) tables = [row[0] for row in result] return {"tables": tables} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)