본문 바로가기
SW/Python

[Flask] MySQL json 데이터 활용

by 17Hyuk 2022. 5. 20.

MySQL에는 json을 넣을 수 있다.

Flask_MySQL_json_데이터활용.zip
0.00MB
SQL

 

 

이런식으로 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

댓글