python-flask /7. SQLite Query - 데이터 활용하기

dothouse·2024년 1월 30일

python_flask

목록 보기
8/11

0. 입력된 데이터를 불러와서 flask에서 사용하는 방법


git : https://github.com/dothouse/practice/tree/master/project1/web
Tool : python / python-flask / html /javascript / css

✅사용 파일

D:\song\practice\project1\web\jeju\views\select3_views.py
https://github.com/dothouse/project1/blob/master/web/jeju/views/select2_views.py

D:\song\practice\project1\web\jeju\templates\select\select3.html
https://github.com/dothouse/project1/blob/master/web/jeju/templates/select/select2.html


1. 파이썬에서 sqlite data불러와서 처리하기(query)

D:\song\practice\project1\web\jeju\views\select3_views.py

1. 이전 페이지에서 입력한 sql데이터를 파이썬으로 불러와서 활용하기

  • select3_view.py 파일 만들기
  • 앱구동을 위한 설정
@bp.route('/select3', methods=('GET', 'POST'))
def show_select3():

1. query문을 활용해 데이터 불러오기


    select_value = db.session.query(selectData).order_by(selectData.id.desc())[0]

db.session.query(selectData)
-> selectData 테이블의 값들을 불러오기

db.session.query(selectData).order_by(selectData.id.desc())[0]
-> id columns 값이 가장 작은 값을 불러와라

  • select2페이지에서 입력된 값들이 자동으로 쿼리에 저장되고, 자동을 id가 부여됨
  • 최신 입력 데이터를 가져오기 위해 id가 가장 큰값을 불러온다.

2. query문을 활용한 filtering

    ### query filtering
    selected_query = db.session.query(Pension)
    if select_value.pet == 1:
        selected_query = selected_query.filter(Pension.ammen.like('%반려동물%'))
    if select_value.pool == 1:
        selected_query = selected_query.filter(Pension.ammen.like('%수영장%'))
    if select_value.garden == 1:
        selected_query = selected_query.filter(Pension.ammen.like('%마당%'))
    if select_value.sea == 1:
        selected_query = selected_query.filter(Pension.ammen.like('%바다%'))
    if select_value.nocost == 1:
        selected_query = selected_query.filter(Pension.ammen.like('%관리비 없음%'))
    if select_value.bus == 1:
        selected_query = selected_query.filter(Pension.ammen.like('%대중교통%'))
    result_query = selected_query.all()

if select_value.pet == 1: selected_query = selected_query.filter(Pension.ammen.like('%반려동물%'))

if select_value.pet == 1: 앞선 페이지에서 반려동물 동반을 선택한 경우

selected_query = selected_query.filter(Pension.ammen.like('%반려동물%'))
-> Pension 테이블에서 ammen 컬럼에서 반려동물이 포함된 data 선택

3. 데이터 계산하기

  • 불러온 데이터를 파이썬을 활용해서 계산

  • 일정 거리 이내의 시설을 계산하고자 함.

-> 거리를 계산하고, 경계보다 안쪽에 있을 경우 cnt값에 1을 할당
-> cnt가 1인 경우 만 숙소 점수 계산에 활용


    # 선택값이 없는 (yes or no)테이블 계산
    pension_data = db.session.query(Pension).all()
    non_distance = []
    non_table_list = ['Police', 'Hospital', 'Bank', 'Mart', 'Parm', 'Gift']
    for data in non_table_list:
        temp_data = db.session.query(globals()[str(data)]).all()
        for j in range(len(pension_data)):
            cnt = 0
            pensionID = pension_data[j].pensionID
            for i in range(len(temp_data)):
                start = (temp_data[i].lat, temp_data[i].lng)
                goal = (pension_data[j].latitude, pension_data[j].longitude)
                haver = haversine(start, goal)
                
                # 거리 설정
                if data == 'Mart':
                    bound = 5
                elif data == 'Police':
                    bound = 20
                elif data == 'Bank':
                    bound = 10
                elif data == 'Hospital':
                    bound = 3
                elif data == 'Parm':
                    bound = 3
                elif data == 'Gift':
                    bound = 10
                if haver < bound:
                    cnt += 1
            non_distance.append([pensionID, cnt, data, bound])


    # 선택값이 있는 테이블 계산 - Tour 13의 경우 Tour 11 / 12 일때 모두 포함
    yes_distance = []
    table_list = [('Tour', select_value.spot2), ('Food', select_value.food)]
    for data, selected in table_list:
        temp_data = db.session.query(globals()[str(data)])
        if ((data == 'Tour') & ((selected % 10) == 1)):
            temp_data2 = temp_data.filter(
                (globals()[str(data)].detailtype == selected) | (globals()[str(data)].detailtype == selected + 2)).all()
        elif ((data == 'Tour') & ((selected % 10) == 2)):
            temp_data2 = temp_data.filter(
                (globals()[str(data)].detailtype == selected) | (globals()[str(data)].detailtype == selected + 2)).all()
        else:
            temp_data2 = temp_data.filter(globals()[str(data)].detailtype == selected).all()
        for j in range(len(pension_data)):
            cnt = 0
            pensionID = pension_data[j].pensionID
            for i in range(len(temp_data2)):
                start = (temp_data2[i].lat, temp_data2[i].lng)
                goal = (pension_data[j].latitude, pension_data[j].longitude)
                haver = haversine(start, goal)
                bound = 10
                if haver < bound:
                    cnt += 1
            yes_distance.append([pensionID, cnt, data, bound])

    count_list = non_distance + yes_distance

    df_count = pd.DataFrame(count_list)
    df_count.columns = ['pensionID', 'cnt', 'data', 'bound']

✅ view 파일, @bp.route('/select3', methods=('GET', 'POST')) def show_select3(): 안에 함수를 만들경우 해당 부분에서만 함수 작동가능

▶ 전체에 적용하기 위해서는 패키지 형태로 만들어 저장
filter.py가 그 예시

4. 만든 데이터를 html로 보내기

 return render_template("select/select3.html",
                           result=result_query,
                           pension1_score=pension1_score, pension2_score=pension2_score, pension3_score=pension3_score,
                           pension1_chk=pension1_chk, pension2_chk=pension2_chk, pension3_chk=pension3_chk,
                           pension1_detail=pension1_detail, pension2_detail=pension2_detail, pension3_detail=pension3_detail,
                           non_distance=count_list, select_value=select_value)
                           

non_distance=count_list

  • count_list 라는 변수를 non_distance라는 이름으로 html에 보낸다.
  • 이를 위해서 처음 부분에 methods=('GET', 'POST')의 설정을 함
profile
새로운 길

0개의 댓글