Создайте пул PostgreSQL на время жизни приложения и выполняйте SQL в /menu через полученное из пула соединение. Не открывайте неограниченное число соединений и не блокируйте async-обработчик синхронным драйвером.
Интеграция PostgreSQL с FastAPI‑приложением
Создайте пул PostgreSQL на время жизни приложения и выполняйте SQL в /menu через полученное из пула соединение. Не открывайте неограниченное число соединений и не блокируйте async-обработчик синхронным драйвером.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Организовать соединение с базой данных PostgreSQL в проекте на FastAPI. Эндпоинт /menu должен получать данные напрямую из таблицы базы, а не использовать статический список, объявленный в коде.
Ответ
Создайте пул PostgreSQL на время жизни приложения и выполняйте SQL в /menu через полученное из пула соединение. Не открывайте неограниченное число соединений и не блокируйте async-обработчик синхронным драйвером.
Пример с Psycopg 3; предполагается таблица menu(id, name):
import os
from contextlib import asynccontextmanager
from fastapi import FastAPI, Request
from psycopg.rows import dict_row
from psycopg_pool import AsyncConnectionPool
@asynccontextmanager
async def lifespan(app):
async with AsyncConnectionPool(
os.environ['DATABASE_URL'], min_size=1, max_size=5,
open=False, kwargs={'row_factory': dict_row}
) as pool:
await pool.wait()
app.state.db = pool
yield
app = FastAPI(lifespan=lifespan)
@app.get('/menu')
async def menu(request: Request):
async with request.app.state.db.connection() as connection:
cursor = await connection.execute(
'SELECT id, name FROM menu ORDER BY id LIMIT 100'
)
return await cursor.fetchall()
Схему и поля подставляют по реальной БД; секрет подключения не помещают в код. Для пользовательских фильтров нужны связанные параметры SQL. Добавьте таймауты, пагинацию и безопасную обработку недоступности БД.
Источник: www.psycopg.org.