현재 진행 중인 팀 프로젝트에서 서울의 여러 구에 있는 음식점이 저장되어 있는 csv 파일을 이용해서 이것을 서울의 5개의 권역으로 따로 묶어주기로 했다. [ 서북권, 도심권, 동북권, 서남권, 동남권 ]
CSV 파일을 mongoDB에 저장하기
일단 csv로 저장되어 있는 데이터를 활용하기 위해 DB에 저장을 해야 한다!
# mongodb.py
import pandas as pd
from pymongo import MongoClient
data = pd.read_csv('VeganMap_csv.csv')
data.reset_index(inplace=True) ## index 생성
data_dict = data.to_dict("records") ## 데이터를 사전형으로 변환 to_dict
client = MongoClient('localhost', 27017)
db = client.vegan
collection = db['vegan']
collection.insert_many(data_dict)
위의 코드는 현재 가지고 있는 VeganMap_csv.csv 란 파일을 pandas와 pymongo를 이용하여 mongodb에 저장하는 코드이다.
pandas로 현재 가지고 있는 csv 파일을 읽는 read_csv를 사용해서 data에 값을 저장한 후,
reset_index를 이용해서 index를 생성해준다. ( 필수는 아니다!)
그 후 to_dict를 사용하는데 이때 orient 파라미터를 전해주는 것에 따라 저장되는 형식이 달라진다.
이때 사전 값의 유형을 정해주는 orient 값은 dict’, ‘list’, ‘series’, ‘split’, ‘records’, ‘index’로 총 6가지가 있다.
- dict (defulat) : column 기준으로 딕셔너리 만들기 {column : {index: value}}
- list : column 기준으로 리스트로 반환 {column : list}
- series : column 기준으로 series로 반환 {column : series}
- split : 각 row를 딕셔너리로 해서 리스트로 반환 [{column1 : value1, column2 : value2}]
- records : 각 row를 딕셔너리로 해서 딕셔너리로 반환 {index : {column1 : value1, column2 : value2}}
- index : 하나의 column을 key로 딕셔너리 반환 {value of column : []}
저는 mongodb에 넣어주기 위해 records를 파라미터로 넣어주어 각 row를 기준으로 딕셔너리 형태로 반환받도록 했습니다!
그 후 넣을 db를 선택하고, collection을 선택 (생성) 해줍니다.
collection.insert_many(data_dict)
그 후 pymongo의 명령어를 통해 data를 한꺼번에 넣어주면 pymongo와 pandas를 이용하여 mongodb에 데이터 넣기는 끝!
넣을 값들을 필터링하기!
# mongodb.py
def west_north():
users = collection.find({"$or": [{'자치구': '은평구'}, {'자치구': '서대문구'}, {'자치구': '마포구'}, {'_id': False}]})
return users
def east_north():
users = collection.find({"$or": [{'자치구': '도봉구'}, {'자치구': '노원구'}, {'자치구': '중랑구'}, {'자치구': '광진구'}, {'자치구': '동대문구'},
{'자치구': '성동구'}, {'자치구': '성북구'}, {'자치구': '강북구'}, {'_id': False}]})
return users
def dosim():
users = collection.find({"$or": [{'자치구': '종로구'}, {'자치구': '중구'}, {'자치구': '용산구'}, {'_id': False}]})
return users
def east_south():
users = collection.find({"$or": [{'자치구': '서초구'}, {'자치구': '강남구'}, {'자치구': '송파구'}, {'자치구': '강동구'}, {'_id': False}]})
return users
def west_south():
users = collection.find({"$or": [{'자치구': '강서구'}, {'자치구': '양천구'}, {'자치구': '구로구'}, {'자치구': '영등포구'}, {'자치구': '동작구'},
{'자치구': '금천구'}, {'_id': False}]})
return users
그 후 pymongo를 이용하여 각 권역으로 잘라내어 값을 반환해주게 했는데요.
이때 $or를 이용하여 조건을 여러 개 설정할 수 있습니다.
Flask main app
from flask import Flask, render_template
from app import mongodb
from pymongo import MongoClient
app = Flask(__name__)
@app.route('/')
def index():
"""route 데코레이션을 통해 어떤 URL 이 우리가 작성한 함수를 실행시키는지 알려준다."""
return render_template('index.html')
@app.route('/<region>')
def shop_region(region=None):
if region == '서북권':
users = mongodb.west_north()
elif region == '도심권':
users = mongodb.dosim()
elif region == '동북권':
users = mongodb.east_north()
elif region == '서남권':
users = mongodb.west_south()
elif region == '동남권':
users = mongodb.east_south()
else:
return render_template('vegan.html', region=region)
return render_template('vegan.html', region=region, datas=users)
그 후 app에 만든 함수를 이용하여 각 템플릿마다 별개의 값을 전달하도록 만들었습니다.
이때, 지정하지 않은 다른 지역을 region 값에 넣을 시에는 데이터를 전달하지 않고 일반 페이지만 나오도록 만들었습니다.
{# vegan.html #}
<!DOCTYPE html>
<title> {{ region }}</title>
{% if datas %}
<h1>{{ region }}가게 리스트</h1>
<ul>
{% for data in datas %}
<li><h3>상호명:{{ data['상호명'] }}</h3></li>
<li><h4>업종:{{ data['업종'] }}</h4></li>
<li><h4>자치구:{{ data['자치구'] }}</h4></li>
<li><h4>도로명주소:{{ data['도로명주소'] }}</h4></li>
<hr>
{% endfor %}
</ul>
{% else %}
<h2>{{ region }}은 존재하지 않은 권역 입니다.</h2>
<h3> 현재 검색 가능 권역</h3>
<ul>
<li>동북권</li>
<li>동남권</li>
<li>도심권</li>
<li>서북권</li>
<li>서남권</li>
</ul>
{% endif %}
위 코드가 연결될 vegan.html의 코드인데요.
이때 if 문을 통해 datas 값이 전달됐을 때만 가게의 리스트가 나오도록 하고, 만약 데이터를 전달받은 게 없다면
잘못된 검색으로 가능 검색 권역을 알려주도록 만들었습니다.
실제 사용
'Study > Flask' 카테고리의 다른 글
[ Flask SQLAlchemy ] SQLAlchemy를 사용하여 엑셀파일 데이터를 DB에 넣기 (0) | 2021.12.30 |
---|---|
[ Flask SQLAlchemy ] SQLAlchemy를 사용하여 엑셀파일 데이터를 DB에 넣기 (0) | 2021.12.30 |
[ Flask ] Flask에서 SQLAlchemy 사용하기! [ Flask ORM ] (2) | 2021.12.30 |
[Flask] 플라스크 동적 페이지 라우팅과 요청 (POST) (0) | 2021.12.18 |
[Flask] Flask 시작하기 (0) | 2021.12.17 |