본문 바로가기
오류/해결

js 로 서버로 값 보내서 두개의 테이블 가지고 오기

by 줘요 2023. 11. 2.

 

record.js 에서 nickname과 sleep_info_id 서버로 전달

 

console.log("닉네임 값:", nickname); // 닉네임 값을 확인하기 위한 로그
    const sleepInfoId = document.getElementById("sleep_info_id").value;
    console.log("수면정보아이디 값", sleepInfoId); // 수면정보 아이디 값 확인
    const requestData = {
      nickname: nickname, // 닉네임을 데이터 객체에 추가
      sleep_info_id: sleepInfoId,
    };
    fetch("/record/info_and_event", {
      method: "POST", // 데이터를 보내기 위해 POST 방식 사용
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(requestData),
    })
      .then((response) => {
        if (response.ok) {
          return response.json();
        } else {
          throw new Error("네트워크 응답이 정상적이지 않습니다.");
        }
      })
      .then((data) => {
        console.log("받은 데이터:", data);
        // 받은 데이터를 처리하거나 표시
      })
      .catch((error) => {
        console.error("요청에 문제가 있습니다:", error);
      });

 

 

schemas.py

class SleepInfoIdNickname(BaseModel):
    sleep_info_id: int
    nickname: str

 

crud.py

def get_related_info_and_events_by_nickname(db: Session, nickname: str, sleep_info_id: int):
    # 닉네임과 sleep_info_id가 일치하는  sleep_event테이블의 sleep_info_id를 가져옵니다.
    db_info_event_data = db.query(model.SleepInfo, model.SleepEvent).join(
        model.SleepEvent, model.SleepInfo.sleep_info_id == model.SleepEvent.sleep_info_id
    ).filter(
        model.SleepInfo.sleep_info_id == sleep_info_id,
        model.SleepInfo.nickname == nickname
    ).all()


    
    return db_info_event_data

 

api_record.py

@router.post("/record/info_and_event")
async def get_info_and_events(info_event_data:SleepInfoIdNickname, db: Session = Depends(get_db)):
    db_info_event_data = get_related_info_and_events_by_nickname(db, info_event_data.nickname, info_event_data.sleep_info_id)
    print("제발",db_info_event_data)  # 여기에 해당 데이터를 출력

    return db_info_event_data

 

 

SQLAlchemy query 함수를 사용하여 SleepInfo SleepEvent 모델에 대한 쿼리를 생성하여 

테이블을 조인하여 SleepInfo sleep_info_id SleepEvent sleep_info_id 서로 일치하는 경우에만 데이터를 반환하려고 함

 

주어진 sleep_info_id nickname 값과 일치하는 데이터를 찾아 모두 가져오려고 하는데 

 

반환하는 데이터가 ,, 없다,,  

 

오류가 나는 것은 아닌데,, 무엇이 잘못된 것인지,, 잘 모르겠다,, 

 

 

값은 잘 전달하고 있는 거 같은데,, 당황스럽다,,

 

여러 시도를 하고 있는데 제일 맞다고 생각한 게 안된다,, 조금 더 고민해봐야 할 거 같다,,

 

 

시도 1:

 

아 다시 보니 수면이벤트 테이블에 값이 저장이 안 되어서 그런 것이었다.

 

저장을 하고 다시 불러왔지만

 

TypeError: cannot convert dictionary update sequence element #0 to a sequence 에러가 나왔다,, 그래도 조금 희망차다

 

시도 2:

 

대대적인 변화를 거쳐 

 

schemas.py

# Pydantic 모델을 사용하여 요청의 body에서 데이터를 추출
class RequestData(BaseModel):
    nickname: str
    sleep_info_id: int

class SleepInfoGet(BaseModel):
    total_sleep: str
    start_sleep: str
    sleep_event: List[str] = []
    event_time: List[str] = []

 

crud.py

def get_sleep_info_with_events_by_nickname_and_id(db: Session, nickname: str, sleep_info_id: int):
    return db.query(model.SleepInfo.total_sleep, model.SleepInfo.start_sleep, model.SleepEvent.sleep_event, model.SleepEvent.event_time).\
        join(model.SleepEvent).\
        filter(model.SleepInfo.nickname == nickname).\
        filter(model.SleepInfo.sleep_info_id == sleep_info_id).\
        filter(model.SleepEvent.sleep_info_id == model.SleepInfo.sleep_info_id).\
        all()

 

api_record.py

@router.post("/record/info_and_event", response_model=SleepInfoGet)
async def get_info_and_events(request_data: RequestData, db: Session = Depends(get_db)):
    db_info_event_data = get_sleep_info_with_events_by_nickname_and_id(
        db, request_data.nickname, request_data.sleep_info_id
    )
    
    results = SleepInfoGet(total_sleep='', start_sleep='', sleep_event=[], event_time=[])
    sleep_events = []
    event_times = []
    for info in db_info_event_data:
        results.total_sleep = info.total_sleep
        results.start_sleep = info.start_sleep
        sleep_events.append(info.sleep_event)
        event_times.append(info.event_time)
    
    results.sleep_event = sleep_events
    results.event_time = event_times
    
    return results

 

원하는 대로 값을 불러올 수 있었다,,, 

 

 

 

잘못했던 것은 schemas.py에 반환받을 데이터의 형태를 지정해주어야 하는데 그렇게 하지 못했고 

 

crud.py에서 select해올 때도 어떤 테이블의 어떤 칼럼을 가져올지 정해주지도 않았다. 

 

api_record에서는 내가 다시 클라이언트로 돌려보내줄 때의 형태를 정해주지 않았고 for 문으로 전체 데이터를 조회시키지 않았기 때문이었다.

 

해결해서 다행이다,,

댓글