반응형
개요
플라스크를 사용해 DB와 연동을 진행해 보자
로컬 환경에서 테스트 용도로 실습할 것이기 때문에 DB는 MySQL을 선택하였다.
Flask-SQLAlchemy와 PyMySQL을 사용해 MySQL에 연결하는 방식이다.
MySQL 설치 관련 내용은 하기 게시글을 참고
패키지 설치
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
반응형
'웹(WEB) > 파이썬(Python)' 카테고리의 다른 글
[Python] Flask 클라이언트 PUT, DELETE 요청 처리 (0) | 2025.01.02 |
---|---|
[Python] Flask 클라이언트 POST 요청 처리 (0) | 2025.01.02 |
[Python] Flask 클라이언트 GET 요청 처리 (0) | 2025.01.02 |
[Python] Flask Router, HTTP 메서드 (0) | 2025.01.02 |
[Python] Flask 기본 (0) | 2024.12.31 |