Я создаю приложение FastaApi + Postgres + Sqlalchemy + Alembic
У меня ошибка
backend-api_1 | File "/app/main.py", line 19, in get_users
backend-api_1 | return db.query(User).all()
...
backend-api_1 | sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "db" (172.24.0.2), port 5433 failed: Connection refused
Вывод моего журнала XXX_ postgresql://user123:pass123@db:5433/dbname — строка подключения выглядит нормально
Мой код :
app/database/session.py
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# Replace with your own PostgreSQL instance
DB_USER = os.getenv("POSTGRES_USER")
DB_PASSWORD = os.getenv("POSTGRES_PASSWORD")
DB_NAME = os.getenv("POSTGRES_DB")
DB_HOST= os.getenv("DB_HOST")
DB_PORT = os.getenv("DB_PORT")
DATABASE_URL = f'postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}'
print("XXX_ ", DATABASE_URL)
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(bind=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
app/main.py
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List, Dict, Any
from models.users import User
from schemas.users import UserSchema, BaseUserSchema
from database.session import get_db
app = FastAPI()
@app.get("/users")
def get_users(db: Session = Depends(get_db)):
return db.query(User).all()
@app.post("/users", response_model=UserSchema, tags=["user"])
def create_user(user_data: BaseUserSchema, db: Session = Depends(get_db)):
query = db.query(User).filter(User.name == user_data.name).first()
if query:
raise HTTPException(status_code=400, detail="User already exist")
new_user = User(**user_data)
db.add(new_user)
db.commit()
return new_user
alembic/env.py (был изменен в соответствии с этим руководством https://www.nashruddinamin.com/blog/how ... rations-in -ваше-приложение-fastapi)
from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
# Interpret the config file for Python logging.
# This line sets up loggers basically.
if config.config_file_name is not None:
fileConfig(config.config_file_name)
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
from app.models import Base
target_metadata = Base.metadata
from app.database.session import DATABASE_URL
config.set_main_option('sqlalchemy.url', DATABASE_URL)
...
Моя инфраструктура создания докеров
version: '3.8'
services:
backend-api:
build:
context: ./app
dockerfile: Dockerfile
ports:
- "8080:8080"
command: uvicorn main:app --host 0.0.0.0 --port 8080 --reload
env_file: ".env"
depends_on:
- db
db:
image: postgres:latest
ports:
- "5433:5432"
expose:
- 5433
env_file: ".env"
Подробнее здесь: https://stackoverflow.com/questions/793 ... on-refused
Подключение к серверу по адресу «db» (172.24.0.2), порт 5433 не удалось: соединение отклонено ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение