본문 바로가기
프로그래밍 언어

[Python] Flask (2) Flask를 DB랑 연동하자!

by 다람이도토리 2021. 5. 10.

많은 분들이 도와주셔서, 어떻게던 해볼 수 있었다 ㅠㅠㅠㅠ 나중에 플젝할때, 돌아와서 해보면 별거 아닐거라고 믿는다...

Flask를 DB랑 연동하기

from flask import Flask, jsonify, request
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
# app start 필요 없음
db = SQLAlchemy(app)

Flask에 SQLAlchemy를 import하였다. 이것의 경우에는 내부에 SQL문 작성 필요 없이 class형태로 구현할 수 있다.

 

Flask를 DB랑 연동하기

class Menus(db.Model):
    id = db.Column(db.Integer, primary_key = True, index = True)
    name = db.Column(db.String(120), nullable = False)
    price = db.Column(db.Integer, nullable = False)

    def __repr__(self):
        return '<menu %r>' % self.id

# 첫 시작에 db 생성을 위해 반드시 필요
db.create_all()

class를 지정하여, 데이터 테이블을 생성하자, 이 때 이후 db.create_all()을 잊지 말자!

 

CRUD의 구현

# Get /menus | 자료를 가지고 옴 (READ)
@app.route('/menus')
def get_menus():
    return jsonify([
        {'id':menu.id,
         'name':menu.name,
         'price':menu.price
        } for menu in Menus.query.all()])

# POST /menus | 자원 추가 (CREATE)
@app.route('/menus', methods=['POST'])
def post_menu(): # request가 JSON이라고 가정한다.
    # 전달받은 자료를 menus 자원에 추가함
    request_data = request.get_json()
    new_menu = Menus(name=request_data['name'],
                     price=request_data['price'])

    db.session.add(new_menu)
    db.session.commit()

    return jsonify([
        {'id': menu.id,
         'name': menu.name,
         'price': menu.price
         } for menu in Menus.query.all()])

@app.route('/menus/<int:id>', methods=['PUT'])
def put_menu(id):
    alter_menu = Menus.query.get_or_404(id)
    update_data = request.get_json()

    alter_menu.name = update_data['name']
    alter_menu.price = update_data['price']

    db.session.commit()

    return jsonify([
        {'id': alter_menu.id,
         'name': alter_menu.name,
         'price': alter_menu.price
         }])

@app.route('/menus/<int:id>', methods=['DELETE'])
def delete_menu(id):
    del_menu = Menus.query.get_or_404(id)
    db.session.delete(del_menu)
    db.session.commit()

    return jsonify([
        {'id': menu.id,
         'name': menu.name,
         'price': menu.price
         } for menu in Menus.query.all()])

  for menu in Menus.query.all()은 특별한 것이 아닌 "반복문"이다. 그저, 쿼리에 있는 모든 데이터를 보여주기 위해 넣은 구문이다. 무서워하지 말자.

데이터에 변환이 생길 경우 commit을 때려야 한다.