MySQL에는 json을 넣을 수 있다.
Flask_MySQL_json_데이터활용.zip
0.00MB
이런식으로 SQL에 name과 JSON인 profiles을 넣어줄 수 있다.
name을 따로 빼준 이유는 UNIQUE 데이터이기 때문에 보기에도 좋고 수정하기 편하기 때문이다.
받아야될 데이터가 고정되지 않거나 추가 또는 삭제가 예정된 경우 유리하다.
우선
# DB생성(utf-8)
CREATE DATABASE tmpdb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE tmpdb;
# 테이블생성
CREATE TABLE users(
name VARCHAR(5) UNIQUE,
profiles JSON
);
이렇게 DB를 만들어주자
app.py
from flask import Flask, render_template, redirect, request, flash
import pymysql
import json
#MySQL 접속
mydb = pymysql.connect(
user='tmp',
database='tmpdb',
passwd='1234',
host='localhost',
charset='utf8'
)
#커서생성
sql_cursor = mydb.cursor(pymysql.cursors.DictCursor)
app = Flask(__name__)
app.secret_key = 'jiqwejioqjweoijqwoiej' # flash를 사용하기 위해서는 필요 (아무값이나 가능)
@app.route('/')
def index():
sql_cmd = f'''
SELECT * FROM users;
'''
sql_cursor.execute(sql_cmd)
users = sql_cursor.fetchall() # 없는경우는 tuple임 # 있는경우는 list임
if users == ():
profiles_dict = 'empty'
else:
# {'카리나': {'sex': '여자', 'age': '22', 'job': '아이돌(에스파)', 'hobby': '', 'mbti': 'ENFP', 'introduction': ''}} 이런식으로 데이터를 바꿔줌
profiles_dict = {}
for user in users:
user_name = user['name']
user_profiles = json.loads(user['profiles']) # json -> dict
profiles_dict.update({user_name : user_profiles})
print(profiles_dict)
return render_template('index.html', profiles_dict=profiles_dict)
@app.route('/save', methods=["POST"])
def save():
# {'name': '카리나', 'sex': '여자', 'age': '22', 'job': '아이돌(에스파)', 'hobby': '', 'mbti': 'ENFP', 'introduction': ''}
user_data = dict(request.form)
name = user_data['name']
# name의 경우 따로 들어가기 때문에 제거해줌
# {'sex': '여자', 'age': '22', 'job': '아이돌(에스파)', 'hobby': '', 'mbti': 'ENFP', 'introduction': ''}
del user_data['name']
# dict -> json 변환
# 변환을 끄지 않으면 '\u3134' 이런식이 되는데 mysql 에서 '\'를 무시해서 'u3134' 저장이 돼서 사용할수 없는 데이터가됨
profiles = json.dumps(user_data, ensure_ascii=False)
try:
# INSERT INTO users(name, profiles) VALUES('카리나', '{"sex": "여자", "age": "22", "job": "가수(에스파)", "hobby": "", "mbti": "ENFP", "introduction": ""}')
sql_cmd = f'''
INSERT INTO users(name, profiles) VALUES('{name}', '{profiles}')
'''
sql_cursor.execute(sql_cmd)
mydb.commit()
flash(f'{name} 추가성공')
return redirect('/')
except:
flash(f'{name} 추가실패')
return redirect('/')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
설명
더보기
우선 (/save)를 보면
request.form 을 통해서 값들을 받아온다.
user_data = dict(request.form) # {'name': '카리나', 'sex': '여자', 'age': '22', 'job': '아이돌(에스파)', 'hobby': '', 'mbti': 'ENFP', 'introduction': ''}
이런식으로 값이 받아졌는데 우리는 name의 경우는 따로 저장할 것이기 때문에 'name' 을 제거해준다.
del user_data['name']
# {'sex': '여자', 'age': '22', 'job': '아이돌(에스파)', 'hobby': '', 'mbti': 'ENFP', 'introduction': ''}
그 후에 이 값을 JSON으로 변환을 해준다음 SQL에 넣어준다.
그 다음은 (/)을 보면 fetchall()을 통해서 값을 가져온다. 그다음 우리는 데이터를 아래처럼 바꿔줬다.
# {'카리나': {'sex': '여자', 'age': '22', 'job': '아이돌(에스파)', 'hobby': '', 'mbti': 'ENFP', 'introduction': ''}}
index.html
<!DOCTYPE html>
<html>
<head>
<title>MySQL josn 실습(17eehyuk)</title>
</head>
<body>
<h1><a href="/">MySQL josn 실습(17eehyuk)</a></h1>
{# flash 메시지 출력 #}
{% with messages = get_flashed_messages() %}
{% if messages %}
<script>
alert(`{{messages[-1]}}`)
</script>
{% endif %}
{% endwith %}
<form method="POST">
이름은 필수 나머지는 자유(미입력가능)<br>
<input type="text" name="name" placeholder="이름" required maxlength="5">
<input type="text" name="sex" placeholder="성별">
<input type="number" name="age" placeholder="나이">
<input type="text" name="job" placeholder="직업">
<input type="text" name="hobby" placeholder="취미">
<input type="text" name="mbti" placeholder="mbti" maxlength="4"><br>
<textarea name="introduction" placeholder="자기소개" style="width: 1044px; height: 47px;"></textarea>
<input type="submit" value="추가" formaction="/save">
</form>
<hr>
<h3>유저목록</h3>
{% if profiles_dict == 'empty' %}
없음
{% else %}
{% for name, data in profiles_dict.items() %}
<fieldset>
<b>{{name}}</b>
<table>
{% for key, value in data.items() %}
<tr>
<td style="width: 100px; text-align: center;">{{key}}</td>
<td>{{value}}</td>
</tr>
{% endfor %}
</table>
</fieldset>
<br>
{% endfor %}
{% endif %}
</body>
</html>
설명
더보기
for문이 2개 있는데
첫번째 for문의 경우 profiles_dict 는
{'카리나': {'sex': '여자', 'age': '22', 'job': '아이돌(에스파)', 'hobby': '', 'mbti': 'ENFP', 'introduction': ''}}
이런식으로 돼있는데 따라서 items()를 사용하면 name에는 '카리나' data에는 그외 값이 저장된다.
두번째 for문의 경우 data는
{'sex': '여자', 'age': '22', 'job': '아이돌(에스파)', 'hobby': '', 'mbti': 'ENFP', 'introduction': ''}
이런식으로 돼있는데 따라서 itmes()를 사용하면 key와 value를 추출할 수 있다.
'SW > Python' 카테고리의 다른 글
[Flask] 커뮤니티사이트 만들기 (0) | 2022.05.21 |
---|---|
[Flask] 로그인 기능 (0) | 2022.05.03 |
[Flask] Templates 사용법4 (0) | 2022.05.01 |
[Flask] Templates 사용법3 (0) | 2022.05.01 |
[Flask] Templates 사용법2 (0) | 2022.05.01 |
댓글