FastAPI 사용을 위한 환경 구성 절차
✅ 실험 목적
dnf install -y python3-devel gcc
[이하 작업은 postgres 유저로 진행]
mkdir /data1/api_pg_test
cd /data1/api_pg_test
python3 -m venv venv
source venv/bin/activate
pip install fastapi uvicorn psycopg2
vi api_server.py
from fastapi import FastAPI
from pydantic import BaseModel
import psycopg2
import re
from typing import Any
app = FastAPI()
# PostgreSQL 연결 설정
DB_CONFIG = {
"host": "localhost",
"port": 5432,
"user": "postgres",
"password": "yourpassword",
"dbname": "yourdb"
}
class PGRequest(BaseModel):
input: str
class PGResponse(BaseModel):
output: Any
# 간단한 프롬프트 → 쿼리 매핑 함수
def prompt_to_query(prompt: str) -> str:
if "고객" in prompt and "주문" in prompt:
# 고객 ID 추출 (예: "고객 2" → 2)
match = re.search(r"고객\s*(\d+)", prompt)
if match:
customer_id = match.group(1)
return f"SELECT * FROM orders WHERE customer_id = {customer_id} ORDER BY order_date DESC LIMIT 5;"
else:
return "SELECT '고객 ID를 찾을 수 없습니다.' AS message;"
else:
return "SELECT '알 수 없는 요청입니다.' AS message;"
@app.post("/mcp/query", response_model=PGResponse)
async def handle_query(req: PGRequest):
prompt = req.input
query = prompt_to_query(prompt)
try:
conn = psycopg2.connect(**DB_CONFIG)
cur = conn.cursor()
cur.execute(query)
rows = cur.fetchall()
colnames = [desc[0] for desc in cur.description]
result = [dict(zip(colnames, row)) for row in rows]
cur.close()
conn.close()
except Exception as e:
return PGResponse(output={"error": str(e)})
return PGResponse(output=result)
@app.get("/")
def root():
return {"status": "API PostgreSQL 서버 실행 중 🚀"}
uvicorn api_server:app --reload
Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
uvicorn api_server:app --host 192.x.x.x --port 8000 --reload
{
"input": "고객 2의 주문 내역 보여줘"
}
{
"output": [
{
"id": 3,
"customer_id": 2,
"order_date": "2024-12-03",
"amount": 20000
}
]
}