해결된 질문
작성
·
22
0
섹션 12 SQLAlchemy 검색 기본 문법
7분 54초
@app.get("/users/{user_id}")
def read_user(user_id: int, db: Session = Depends(get_db)):
db_users = db.query(User.username, User.email).all()
if db_users == []:
return {"error": "User not found"}
return {"db_users": db_users}
강의 내용과 동일하게 작성하여 실행 했는데,
아래와 같은 오류가 났습니다.
구글 검색 해 봐도... 잘 모르겠어서 질문 남겨봅니다...
ValueError: [ValueError('dictionary update sequence element #0 has length 6; 2 is required'), TypeError('vars() argument must have __dict__ attribute')]
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
HYO JIN Kim님께서 SQLAlchemy와 FastAPI를 사용해 데이터를 검색하는 과정에서 발생한 오류에 대해 설명드리겠습니다.
현재 제공해주신 코드에서 db.query(User.username, User.email).all()
부분은 데이터베이스에서 여러 사용자의 username
과 email
만을 조회하고, 이를 리스트로 반환합니다. 그러나 오류 메시지로 보아, 반환된 결과를 잘못 처리하거나, 예상하지 못한 형식으로 값을 반환하고 있을 가능성이 있습니다.
해결 방안은 다음과 같습니다:
데이터 형식 확인:
query
메서드를 사용하여 데이터베이스로부터 데이터를 가져올 때는 반환 형식이 튜플의 리스트일 가능성이 큽니다. 따라서 db_users
는 실제로는 리스트 of 튜플입니다. 이 경우 return {"db_users": db_users}
부분에서 JSON 직렬화 문제로 인해 오류가 발생할 수 있습니다.
데이터 변환:
반환할 데이터를 딕셔너리 형식으로 변환해보세요. 예를 들어, 다음과 같이 사용할 수 있습니다:
@app.get("/users/{user_id}")
def read_user(user_id: int, db: Session = Depends(get_db)):
db_users = db.query(User.username, User.email).all()
result = [{"username": user.username, "email": user.email} for user in db_users]
if not result:
return {"error": "User not found"}
return {"db_users": result}
기본적으로 User.username
과 User.email
는 Attribute 보다는 실제로 값을 가지고 있는 객체이므로, 각 튜플을 반복하면서 딕셔너리 형식으로 변환하는 것이 필요합니다.
만약 위의 해결법으로도 문제가 지속된다면, 추가적인 코드나 오류 메시지를 공유해 주시면 더욱 구체적인 도움을 드릴 수 있습니다. SQLAlchemy와 관련된 다른 문제들이 아래 게시글에서는 다루어졌기도 합니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.