인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

최원호님의 프로필 이미지
최원호

작성한 질문수

처음하는 파이썬 백엔드 FastAPI 부트캠프 (FastAPI부터 비동기 SQLAlchemy까지) [풀스택 Part1-2]

mySQL과 fastAPI가 연동이 안됨

작성

·

248

0

mysql 과 mysql workbench를 설치하고 접속하려는데 안돼서 고생하고 있습니다.

코드는 아래와 같고

'code'

from fastapi import FastAPI, Depends

from sqlalchemy.orm import Session

from sqlalchemy import Column, Integer, String, create_engine

from sqlalchemy.ext.declarative import declarative_base

from pydantic import BaseModel


DATABASE_URL = "mysql+pymysql://newjeans:@gaius2127@localhost:3306/db_name"

engine = create_engine(DATABASE_URL)

Base = declarative_base()


class User(Base):

    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, index=True)

    username = Column(String(50), unique=True, index=True)

    email = Column(String(120))


class UserCreate(BaseModel):

    username: str

    email: str


def get_db():

    db = Session(bind=engine)

    try:

        yield db

    finally:

        db.close()


Base.metadata.create_all(bind=engine)


app = FastAPI()


@app.get("/")

def read_root():

    return {"message": "Now, tackle with mySQL"}


@app.post("/users/")

def create_user(user: UserCreate, db: Session = Depends(get_db)):

    new_user = User(username=user.username, email=user.email)

    db.add(new_user)

    db.commit()

    db.refresh(new_user)


    return {"id": new_user.id, "username": new_user.username, "email": new_user.email}

 

 

터미널에 메세지는

PS C:\wonnho\fastapi> python -m uvicorn main:app --reload

INFO: Will watch for changes in these directories: ['C:\\wonnho\\fastapi']

INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

INFO: Started reloader process [20636] using StatReload

Process SpawnProcess-1:

Traceback (most recent call last):

File "C:\Python312\Lib\site-packages\pymysql\connections.py", line 644, in connect

sock = socket.create_connection(

^^^^^^^^^^^^^^^^^^^^^^^^^

File "C:\Python312\Lib\socket.py", line 828, in create_connection

for res in getaddrinfo(host, port, 0, SOCK_STREAM):

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "C:\Python312\Lib\socket.py", line 963, in getaddrinfo

for res in _socket.getaddrinfo(host, port, family, type, proto, flags):

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

socket.gaierror: [Errno 11003] getaddrinfo failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "C:\Python312\Lib\site-packages\sqlalchemy\engine\base.py", line 3280, in wrappool_connect

return fn()

^^^^

 

중간 생략.....

 

File "C:\Python312\Lib\site-packages\pymysql\connections.py", line 358, in init

self.connect()

File "C:\Python312\Lib\site-packages\pymysql\connections.py", line 711, in connect

raise exc

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'gaius2127@localhost' ([Errno 11003] getaddrinfo failed)")

(Background on this error at: https://sqlalche.me/e/14/e3q8)

아이디와 패스워드가 문제인거 같은데 뭐가 문제인지 모르겠네요. 륀튼에게 물어보고 제미나이도 물어봤는데 해결이 안되어 힌트라도 얻을려고 질문합니다.스크린샷 2024-10-04 010353.png위에 newjeans라는 아이디가 있음.

답변 2

0

안녕하세요. 답변 도우미입니다.

문제를 보면 MySQL에 연결할 때 오류가 발생하고 있는 것 같습니다. 오류 메시지를 보면 다음과 같은 문제가 제기되고 있습니다:

```

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'gaius2127@localhost' ([Errno 11003] getaddrinfo failed)")

```

오류의 핵심은 getaddrinfo failed이며, 이는 네트워크 연결에 문제가 있을 수 있음을 나타냅니다. 특히, 다음 부분에 주목해야 합니다.

```python

DATABASE_URL = "mysql+pymysql://newjeans:@gaius2127@localhost:3306/db_name"

```

### 1. 잘못된 DATABASE_URL 형식

DATABASE_URL에서 newjeans:@gaius2127@localhost 부분을 보면 문제가 발생할 가능성이 큽니다. 현재 상태는 아이디:@비밀번호@호스트 형식으로 되어 있는데, 이것은 잘못된 형식입니다.

MySQL 연결 URL의 올바른 형식은 다음과 같습니다:

```

mysql+pymysql://username:password@host:port/database_name

```

따라서, 현재 DATABASE_URL은 다음과 같이 수정되어야 합니다:

```python

DATABASE_URL = "mysql+pymysql://newjeans:gaius2127@localhost:3306/db_name"

```

즉, 아이디가 newjeans이고 비밀번호가 gaius2127인 경우, 해당 URL을 올바르게 수정해야 합니다.

### 2. 비밀번호 설정 확인

스크린샷을 보면, newjeans 사용자의 비밀번호가 설정되어 있는 것으로 보입니다. MySQL Workbench를 통해 해당 사용자의 비밀번호가 정확히 gaius2127로 설정되어 있는지 다시 확인해 보세요. 만약 비밀번호가 다르다면 MySQL Workbench에서 비밀번호를 변경하고 다시 시도해보세요.

### 3. MySQL 서버 실행 여부 확인

또한, MySQL 서버가 현재 실행 중인지 확인해야 합니다. 터미널이나 명령 프롬프트에서 다음 명령어로 MySQL 서버가 실행되고 있는지 확인할 수 있습니다:

```bash

sudo systemctl status mysql # Linux

```

또는

```bash

net start MySQL # Windows

```

### 4. 포트 확인

기본적으로 MySQL은 포트 3306을 사용합니다. MySQL이 이 포트를 사용하는지 확인해야 합니다. 혹시 다른 포트를 사용하고 있다면, 해당 포트를 DATABASE_URL에 반영해야 합니다.

```python

DATABASE_URL = "mysql+pymysql://newjeans:gaius2127@localhost:포트번호/db_name"

```

### 5. 방화벽 설정 확인

로컬에서 MySQL에 접근하려고 하는데 방화벽이나 네트워크 설정 때문에 접근이 막혀 있을 수 있습니다. 로컬 MySQL 접근에 필요한 포트(기본적으로 3306번 포트)가 방화벽에서 허용되어 있는지 확인해보세요.

위의 사항들을 확인한 후 다시 시도해 보시면 문제가 해결될 가능성이 큽니다.

감사합니다.

잔재미코딩 드림.

0

안녕하세요, 인프런 AI 인턴입니다. 최원호님, FastAPI와 MySQL 연동에 어려움을 겪고 계신 것 같군요. 문제를 해결하기 위해 몇 가지 점을 검토해보겠습니다.

주된 문제:

  • 에러 메시지에 따르면, MySQL 서버에 연결할 때 username과 hostname을 잘못 설정한 것처럼 보입니다. 특히, gaius2127@localhost 부분이 문제입니다.

해결 방법:

  1. 데이터베이스 URL 확인:

    • 코드에서 DATABASE_URL을 “mysql+pymysql://newjeans:@gaius2127@localhost:3306/db_name”로 설정하셨는데, 이는 잘못된 형식으로 보입니다. MySQL 연결 URL 형식은 mysql+pymysql://<username>:<password>@<hostname>:<port>/<dbname>입니다. 특히, password 부분에서 @가 포함되면 안 됩니다. 만약 비밀번호에 @가 포함되어 있다면 %40으로 인코딩하세요. 예를 들어: mysql+pymysql://newjeans:password%40123@localhost:3306/db_name
  2. 계정 설정 확인:

    • 이미지에서 newjeans@localhost로 설정된 MySQL 계정이 보입니다. 이 계정의 비밀번호가 DATABASE_URL에 올바르게 설정되어 있는지 확인하세요.
  3. MySQL 서버 상태 확인:

    • MySQL 서버가 정상적으로 작동 중인지 확인하세요. MySQL Workbench에서 서버가 실행 중이어야 합니다.

참고 게시물:

위의 방법을 통해 문제가 해결되길 바랍니다. 어려움이 지속된다면 추가 오류 메시지나 문제 상황을 공유해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

최원호님의 프로필 이미지
최원호

작성한 질문수

질문하기