웹(WEB)/파이썬(Python)

[Python] Flask DB 연동

마달랭 2025. 1. 2. 01:12
반응형

개요

플라스크를 사용해 DB와 연동을 진행해 보자

로컬 환경에서 테스트 용도로 실습할 것이기 때문에 DB는 MySQL을 선택하였다.

Flask-SQLAlchemy와 PyMySQL을 사용해 MySQL에 연결하는 방식이다.

 

MySQL 설치 관련 내용은 하기 게시글을 참고

MySQL 설치

 

MySQL 설치

MySQL CommunityMySQL 사용을 위해 설치해 보자 https://downloads.mysql.com/archives/installer/ MySQL :: Download MySQL Installer (Archived Versions)Please note that these are old versions. New releases will have recent bug fixes and features! To

zzzz955.tistory.com

 

 

패키지 설치

pip install Flask Flask-SQLAlchemy PyMySQL

 

  • Flask: 웹 애플리케이션 프레임워크
  • Flask-SQLAlchemy: Flask에서 SQLAlchemy를 쉽게 사용할 수 있게 해줌
  • PyMySQL: Flask와 MySQL을 연결하는 드라이버

 

 

 

MySQL 데이터베이스 생성

CREATE DATABASE exampledb;
CREATE USER 'flaskuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON exampledb.* TO 'flaskuser'@'localhost';
FLUSH PRIVILEGES;

 

  • exampledb라는 데이터베이스를 만들고, flaskuser라는 사용자에게 권한을 부여함.
  • 비밀번호는 password로 설정했어. 필요에 따라 바꿔도 된다.


쿼리문이 정상적으로 실행되었다.

 

 

 

Flask 애플리케이션 설정

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# DB 연결 설정
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://flaskuser:password@localhost/exampledb'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

 

  • mysql+pymysql://username:password@localhost/dbname 형태로 MySQL과 연결.
  • flaskuser:password는 MySQL에 설정한 계정 정보

 

데이터 모델 정의

 

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    description = db.Column(db.String(200))

    def __repr__(self):
        return f'<Item {self.name}>'

 

  • Item 테이블을 정의했다.
  • id, name, description 필드로 구성됨

 

 

테이블 생성

def create_tables():
    db.create_all()
  • 테이블 생성 관련 로직이다.
  • 서버가 처음 실행될 때 테이블을 생성하도록 설정

 

CRUD API 구현(클라이언트 연동 시)

from flask import request, jsonify


# 아이템 생성 (POST)
@app.route('/items', methods=['POST'])
def create_item():
    data = request.json
    new_item = Item(name=data['name'], description=data['description'])
    db.session.add(new_item)
    db.session.commit()
    return jsonify({'message': 'Item created'}), 201


# 모든 아이템 조회 (GET)
@app.route('/items', methods=['GET'])
def get_items():
    items = Item.query.all()
    return jsonify([{'id': item.id, 'name': item.name, 'description': item.description} for item in items])


# 특정 아이템 수정 (PUT)
@app.route('/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    data = request.json
    item = Item.query.get(item_id)
    if not item:
        return jsonify({'message': 'Item not found'}), 404

    item.name = data['name']
    item.description = data['description']
    db.session.commit()
    return jsonify({'message': 'Item updated'})


# 특정 아이템 삭제 (DELETE)
@app.route('/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    item = Item.query.get(item_id)
    if not item:
        return jsonify({'message': 'Item not found'}), 404

    db.session.delete(item)
    db.session.commit()
    return jsonify({'message': 'Item deleted'})

 

해당 로직은 클라이언트가 구현 된 상태에서 사용해 주어야 한다.

서버-DB 연결만 구현되어 있을 경우 해당 로직을 수행할 방법이 없다.

 

 

종합

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

app = Flask(__name__)

# DB 연결 설정
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://flaskuser:password@localhost/exampledb'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    description = db.Column(db.String(200))

    def __repr__(self):
        return f'<Item {self.name}>'

def create_tables():
    db.create_all()

# 애플리케이션 컨텍스트 내에서 테이블 생성
if __name__ == '__main__':
    with app.app_context():  # 애플리케이션 컨텍스트 설정
        db.create_all()  # 테이블 생성
    app.run(debug=True)

 

현재 로직은 Flask앱 초기화 및 DB설정부터 데이터 모델 정의, 라우트(API) 정의, DB 초기화 및 설정 등 모든 내용이 한 py파일 내에 작성이 되어있다.

이후 프로젝트가 커질 경우 구조를 나누어 모듈화를 진행해야 한다.

 

해당 로직을 실행하면 MySQL Workbench의 exampledb에 item테이블이 생성된 점을 확인할 수 있다.

 

각 칼럼을 보면 타입과 Null여부, 프라이머리 키 여부 등이 잘 적용된 것을 볼 수 있다.

728x90
반응형