我在将 docker mysql 与 fastapi 连接时遇到问题

Posted

技术标签:

【中文标题】我在将 docker mysql 与 fastapi 连接时遇到问题【英文标题】:I have a problem in connecting docker mysql with fastapi 【发布时间】:2022-01-05 22:49:52 【问题描述】:

当我运行这个命令时

uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

我收到此错误

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '0.0.0.0' ([WinError 10049] The requested address is not valid in its context)") (此错误的背景:http://sqlalche.me/e/14/e3q8)

以下两个命令,都可以正常工作:

uvicorn app.main:app --host 127.0.0.1 --port 8000 --reload

uvicorn app.main:app --host localhost --port 8000 --reload

只有 0.0.0.0 不起作用。 我试图解决它,但现在我要求你看看这个。 谢谢。

这是 Docker 镜像运行代码

docker run -d --name fastapi-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=dev -e MYSQL_USER=admin -e MYSQL_PASSWORD=1234 mysql:8.0 --character-set-server=utf8mb4 --collat​​ion-server=utf8mb4_unicode_ci

# models.py

from sqlalchemy import Boolean, Column, Integer, String

from .database import Base

class User(Base):
    __tablename__ = "user"

    id = Column(Integer, primary_key=True)
    email = Column(String(255), unique=True, index=True)
    password = Column(String(255))
    is_active = Column(Boolean, default=True)
# database.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


engine = create_engine("mysql+pymysql://admin:1234@0.0.0.0:3306/dev")
SessionLocal = sessionmaker(
    bind=engine,
    autocommit=False,
    autoflush=False,
)

Base = declarative_base()
# schemas.py

from pydantic import BaseModel


class UserBase(BaseModel):
    email: str


class UserCreate(UserBase):
    password: str


class User(UserBase):
    id: int
    email: str
    is_active: bool

    class Config:
        orm_mode = True
# main.py

from typing import List

from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session

from . import models, schemas
from .database import SessionLocal, engine

models.Base.metadata.create_all(bind=engine)


app = FastAPI()


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


@app.post("/users", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    existed_user = db.query(models.User).filter_by(
        email=user.email
    ).first()

    if existed_user:
        raise HTTPException(status_code=400, detail="Email already registered")

    user = models.User(email=user.email, password=user.password)
    db.add(user)
    db.commit()

    return user


@app.get("/users", response_model=List[schemas.User])
def read_users(db: Session = Depends(get_db)):
    return db.query(models.User).all()

docker image

【问题讨论】:

请阅读这篇文章meta.***.com/questions/285551/… 并编辑您的问题 【参考方案1】:

试试:

engine = create_engine("mysql+pymysql://admin:1234@localhost:3306/dev")

【讨论】:

这在 Docker 上下文中可能是错误的(尽管比 0.0.0.0, "everywhere" 更有意义)。在没有看到问题中的任何实际代码或配置的情况下,这有点难以判断。 谢谢。 'localhost' 而不是 '0.0.0.0' 实际上有效。但我仍然想知道为什么 0.0.0.0 不起作用? 如何连接到“无处不在”?显然,如果你用它来连接,那是行不通的。

以上是关于我在将 docker mysql 与 fastapi 连接时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个NodeJS docker容器连接在一起?

Spring Boot + MySQL docker 容器

Node.js 与 MySQL docker 容器网络设置

mysql docker容器 - 无法与Windows连接

无法访问本地主机上的 Docker 容器 [重复]

我在将 klaviyo 与 laravel 集成时遇到了这个错误