[T.I.L] 221201 - MySQL, flask가 도대체 뭔데..?

권병석·2022년 12월 1일
0

T.I.L (스파르타)

목록 보기
13/22

이전에 진행 했었던 미니 프로젝트에서 flask와 몽고db를 사용 했었지만
나는 아무것도 몰랐어서 엄청난 구글링을 통해서 그냥... 코드 몇 줄을 야매로 바꿔가면서 했었다.

오늘 아침까지만 해도 MySQL이 무엇인지 몰랐고 flask가 뭔지도 몰랐다.

어제 튜터님이 MySQL 강의를 해주셨을때.. DBeaver로 막 MySQL문 쓰는거 따라하다가 중간에 놓쳐서
포기하고 그냥 알고리즘이라도 풀러 나갔었다.

데이터베이스는 엑셀 같은거다... 라고만 알고있었고
DBeaver를 통해서 mysql을 써서 막 insert 하고 create table 하고 뭐 그러다보면 표 같은거 만드는건 알겠는데
flask는 도대체 뭔데....
app.py는 도대체 무슨 파일이고.. flask를 왜 import 하는건데 ㅠㅠ
게다가 flask와 MySQL 연동을 어떻게 하는건데...ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

부트캠프 시작 전에 들었던 '웹 개발 종합반' 강의에선 그냥 따라하라는대로 쳤을뿐이고
외우는거 아니라고 해서 그냥 따라 치기만 했었는데..
왜 수업을 듣는 사람들은 flask를 다 잘 아는거지?

진짜 멘붕 그 자체였다.
그리고 아직도 멘붕중이다.

다행히도 오늘 좋은 강의들을 찾아서
기초적인 MySQL 작성방법과
flask에 대해서 좀 많이 배웠다.
뭔가 많이 배운거 같고
이제 뭔가 감이 잡히고 있는것 같아서
나중에 다 완벽하게 알았을 때, 나 같이 헤매는 사람들을 위해 강좌 글도 쓰고 싶은 욕구가 벌써부터 든다.

flask는 생활코딩에서 강의를 들었는데
생활코딩은 진짜 신인가...? 진짜 내 눈높이에 맞춰서 강의를 해주신다.

아래 코드는 생활코딩에서 배우면서 작성했던 코드다.

from flask import Flask, request, redirect
import random

app = Flask(__name__)

nextId = 4
topics = [
    {'id': 1, 'title': 'html', 'body': 'html is ...'},
    {'id': 2, 'title': 'css', 'body': 'css is ...'},
    {'id': 3, 'title': 'javascript', 'body': 'javascript is ...'}
]


def template(contents, content, id=None):
    contextUI = ''
    if id != None:
        contextUI = f"""
            <li><a href="/update/{id}/">update</a></li>
            <li><form action="/delete/{id}" method="POST"><input type="submit" value="delete"></form></li>
        """
    return f'''<!doctype html>
    <html>
        <body>
            <h1><a href="/">WEB</a></h1>
            <ol>
                {contents}
            </ol>
            {content}
            <ul>
                <li><a href="/create/">create</a></li>
                {contextUI}
            </ul>
        </body>
    </html>
'''


def getContents():
    liTags = ''
    for topic in topics:
        liTags = liTags + \
            f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
    return liTags


@app.route('/')
def index():

    return template(getContents(), '<h2>Welcome</h2>Hello, WEB')


@app.route('/create/', methods=['GET', 'POST'])
def create():
    if request.method == 'GET':
        content = '''
            <form action="/create/" method="POST">
                <p><input type="text" name="title" placeholder="title"></p>
                <p><textarea name="body" placeholder="body"></textarea></p>
                <p><input type="submit" value="create"></p>
            </form>
        '''
        return template(getContents(), content)
    elif request.method == 'POST':
        global nextId
        title = request.form['title']
        body = request.form['body']
        newTopic = {'id': nextId, 'title': title, 'body': body}
        topics.append(newTopic)
        url = '/read/'+str(nextId)+'/'
        nextId = nextId + 1
        return redirect(url)


@app.route('/read/<int:id>/')
def read(id):
    title = ''
    body = ''
    for topic in topics:
        if id == topic['id']:
            title = topic['title']
            body = topic['body']
            break

    return template(getContents(), f'<h2>{title}</h2>{body}', id)


@app.route('/update/<int:id>/', methods=['GET', 'POST'])
def update(id):
    if request.method == 'GET':
        title = ''
        body = ''
        for topic in topics:
            if id == topic['id']:
                title = topic['title']
                body = topic['body']
                break
        content = f'''
            <form action="/update/{id}/" method="POST">
                <p><input type="text" name="title" placeholder="title" value="{title}"></p>
                <p><textarea name="body" placeholder="body">{body}</textarea></p>
                <p><input type="submit" value="update"></p>
            </form>
        '''
        return template(getContents(), content)
    elif request.method == 'POST':
        global nextId
        title = request.form['title']
        body = request.form['body']
        for topic in topics:
            if id == topic['id']:
                topic['title'] = title
                topic['body'] = body
                break
        url = '/read/'+str(id)+'/'
        return redirect(url)


@app.route('/delete/<int:id>/', methods=['POST'])
def delete(id):
    for topic in topics:
        if id == topic['id']:
            topics.remove(topic)
            break

    return redirect('/')


app.run(port=5001, debug=True)

그리고
MySQL은 여기서 들었다.

한빛미디어
여기는 완전 핵 기초부터 설명을 해주셔서 완전 만족스러웠다.

아래는 부트캠프 튜터님 수업을 놓쳤던게 너무 아쉬워서 다시보기로 완주하면서 적었던 코드들이다.

-- 데이터베이스 생성
CREATE DATABASE `shop_db`;

-- 테이블 생성
-- 학생 테이블 생성
CREATE TABLE shop_db.product(
	product_name CHAR(4) PRIMARY KEY
	,
	cost INT NOT NULL
	,
	make_date DATE
	,
	company CHAR(5)
	,
	amount INT NOT NULL
);

-- 학생테이블 수정(city_id)추가 및 외래키 
ALTER TABLE student ADD city_id int,
ADD CONSTRAINT `fk_city_table_id` FOREIGN KEY student(city_id) REFERENCES city(id);

SELECT
	s.name, c.name
FROM
	student s
INNER JOIN city c ON
	s.city_id = c.id;

-- 도시 테이블 생성
CREATE TABLE city(
	id int PRIMARY KEY AUTO_INCREMENT
	,
	name varchar(50) NOT NULL
)

-- 도시 데이터 생성
INSERT
	INTO
	`member` (
		member_id
		, member_name
		, member_addr
	)
VALUES(
	'carry'
	, '머라이어'
	, '미국 텍사스 사막'
);

-- 학생 데이터 입력
INSERT
	INTO
	product (
		  product_name
		, cost
		, make_date
		, company
		, amount
	)
VALUES(
	'바나나'
	, '1500'
	, '2021-07-01'
	, '델몬트'
	, '17'
)
,(
	'카스'
	, '2500'
	, '2022-03-01'
	, 'OB'
	, '3'
)
,(
	'삼각김밥'
	, '800'
	, '2023-09-01'
	, 'CJ'
	, '22'
);

-- 학생 이메일 업데이트
UPDATE
	`member`
SET
	member_addr = '영국 런던 먹자골목'
WHERE
	member_id = 'carry';
	
-- 학생 검색 (이메일)
SELECT * FROM student s
WHERE email LIKE "%@naver.com"

-- 학생 데이터 삭제
DELETE
FROM
	member
WHERE
	member_id = 'carry';

-- 특정 유저 조회
SELECT * FROM member WHERE member_name  = '아이유';

-- 인덱스 생성
CREATE INDEX inx_member_name ON member(member_name);

-- 뷰(바로가기) 생성
CREATE VIEW member_view AS
SELECT
	*
FROM
	MEMBER;

SELECT * FROM member_view;

-- 스토어드 프로시저 만들기 ㅋㅋㅋ
DELIMITER //
CREATE PROCEDURE myProc()
BEGIN
	SELECT * FROM member WHERE member_name = '나훈아';
	SELECT * FROM product WHERE product_name = '삼각김밥';
END //
DELIMITER ;

-- 스토어드 프로시저 삭제
DROP PROCEDURE IF EXISTS myProc;

-- 스토어드 프로시저 부르기
CALL myProc();

아직 MySQL과 flask 연동하는 법은 모르지만..
그건 내일 알아보려고 한다.. 너무 졸립다.. 쓰러질것 같아..

profile
Back-End 개발자를 꿈꾸는 디제이였던 백수의 TIL 일기장 입니다.

0개의 댓글