안녕하세요.
이번 시간에는 웹 프레임워크인 Flask에서 SQLAlchemy 사용하는 방법을 알아보고자 합니다.
Flask에서 데이터베이스와 상호작용하는 방법은 여러 가지가 있지만 SQLAlchemy와 함께 많이 사용됩니다.
1. SQLAlchemy란?
SQLAlchemy는 파이썬에서 사용되는 인기있는 ORM(Object-Relational Mapping) 라이브러리입니다. Django에서는 기본적으로 내장된 ORM이 있기 때문에 모델을 생성한 후 바로 사용이 가능하나 Flask에서는 별도의 과정이 필요합니다.
2. SQLAlchemy의 특징
1. 데이터베이스 추상화
SQLAlchemy는 데이터베이스와의 상호 작용을 추상화하여 개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스에 접근할 수 있도록 합니다. 이를 통해 개발자는 데이터베이스와의 상호 작용을 보다 간단하게 처리할 수 있으며, 데이터베이스 종속성을 줄이고 이식성을 향상시킵니다.
2. 객체 지향적 접근
제가 SQLAlchemy를 사용하는 주된 이유 중 하나입니다. SQLAlchemy는 객체 지향 프로그래밍의 개념을 데이터베이스에 적용합니다. 데이터베이스 테이블은 파이썬 클래스로 매핑되고, 테이블의 각 레코드는 클래스의 인스턴스로 표현됩니다. 이를 통해 개발자는 SQL 쿼리 대신 파이썬 객체를 사용하여 데이터를 조작할 수 있습니다. 이는 코드의 가독성과 유지 보수성을 향상시키며, 객체 지향적인 개발 방식을 유지할 수 있습니다.
3. ORM의 기능과 유연성
다양한 ORM 기능을 제공합니다. 이를 통해 데이터베이스 테이블 간의 관계를 정의하고, 데이터 검색, 삽입, 수정, 삭제 등을 쉽게 처리할 수 있습니다. 또한, SQLAlchemy는 데이터베이스 종류에 관계없이 일관된 인터페이스를 제공하므로, 다양한 데이터베이스 시스템을 지원하면서 유연성을 제공합니다.
4. 보안성과 안정성
SQLAlchemy는 SQL 인젝션 공격과 같은 보안 문제를 방지하는데 도움을 줍니다. 내부적으로 SQL 쿼리를 생성하고 실행할 때 매개 변수화된 쿼리를 사용하므로, 외부 입력에 대한 적절한 이스케이프가 자동으로 처리됩니다. 이는 보안 취약점을 최소화하고, 데이터베이스 상호 작용의 안정성을 높입니다.
5. 확장성
SQLAlchemy는 다양한 데이터베이스 시스템을 지원하며, 복잡한 쿼리와 대규모 데이터베이스 작업을 처리할 수 있습니다. 또한, SQLAlchemy는 Flask와 함께 사용하기 쉽게 통합되어 있으며, Flask의 생태계와 다양한 확장 기능과의 호환성을 제공합니다.
개발하다 보면 어려움을 겪는 것 중에 하나가 다른 사람의 코드를 보는 것입니다. 많은 테이블과 관계, 복잡한 쿼리로 인해 데이터베이스의 구조를 파악하는 것이 어렵기 때문에 Flask에서 SQLAlchemy를 사용함으로써 가독성을 높이고 개발자는 데이터베이스와의 상호 작용을 단순화하고, 객체 지향 프로그래밍의 원리를 유지하면서 데이터베이스 액세스를 처리할 수 있습니다. 이는 생산성 향상과 코드의 유지 보수성을 향상시키는 장점을 제공합니다.
3. Flask-Migrate란?
Migrate는 데이터베이스 스키마의 변경을 관리하고, 애플리케이션의 데이터베이스를 업데이트하는 도구입니다. SQLAlchemy와 함께 사용되어 데이터베이스 스키마의 변경 사항을 추적하고, 이를 쉽게 적용할 수 있도록 도와줍니다.
4. Flask-Migrate의 특징
1. 데이터베이스 버전 관리
데이터베이스 스키마의 변경 사항을 버전 관리할 수 있습니다. 변경 사항을 스크립트 형태로 저장하고, 데이터베이스를 이전 버전 또는 최신 버전으로 업데이트할 수 있습니다. 이를 통해 애플리케이션의 데이터베이스 스키마를 관리하고, 여러 개발자가 협업하는 경우에도 일관성을 유지할 수 있습니다.
2. 스키마 변경의 안전한 적용
데이터베이스 스키마 변경을 안전하게 적용할 수 있습니다. 변경 사항을 스크립트로 정의하면, 이전 버전에서 최신 버전으로의 마이그레이션 작업을 수행할 때 데이터의 일관성을 유지하고, 오류가 발생한 경우 롤백할 수 있습니다.
3. 개발과 배포의 용이성
Migrate를 사용하면 애플리케이션의 개발 단계와 배포 단계에서 데이터베이스 스키마 변경을 쉽게 관리할 수 있습니다. 개발 중에는 변경 사항을 적용하고 롤백하며, 배포 시에는 최신 버전으로의 마이그레이션을 수행하여 애플리케이션과 데이터베이스를 일치시킬 수 있습니다.
5. SQLAlchemy-Flask Migrate 설치 (Windows 10)
1. SQLAlchemy 설치하기
pip install Flask
pip install SQLAlchmey
pip install Flask-SQLAlchemy
pip install mysqlclient
2. Flask-Migrate 설치하기
pip install Flask-Migrate
3. config.py 작성하기
# config.py
from flask import Flask
from flask_migrate import Migrate
from models import db
migrate = Migrate()
def create_app():
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://[DB_USER]:[DB_PASSWORD]@[DB_HOST]:[DB_PORT]/[DB_NAME]"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.secret_key = '[SECRET KEY]'
db.init_app(app)
migrate.init_app(app, db)
return app
다음과 같이 [DB_USER], [DB_PASSWORD], [DB_HOST], [DB_PORT], [DB_NAME], [SECRET KEY]를 설정합니다.
예를 들어 'mysql://root:qwer1234@localhost:3306/test' 이런식으로 작성해주면 되고 SECRET KEY는 본인만 식별 가능한 문자로 입력합니다.
4. main.py 작성하기
# main.py
from config import create_app
app = create_app()
@app.route('/')
@app.route('/index')
def index():
return render_template('index.html')
5. models.py 작성하기
# models.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
__tablename__ = "User"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50))
email = db.Column(db.String(50))
password = db.Column(db.String(300))
def __init__(self, username, email, password):
self.username = username
self.email = email
self.password = password
6. Hands-On
flask db init
설정한 config를 migrations로 만들어주기 위해 다음과 같이 flask db init을 사용합니다.
flask db migrate
migrations 파일에서 변경 사항을 감지하여 migrate하기 위해 flask db migrate를 합니다.
flask db upgrade
데이터베이스에 migrate를 적용하기 위해 flask db upgrade를 합니다.
정상적으로 테이블이 생성된 모습을 확인할 수 있습니다.
이번 시간에는 Flask-Migrate를 이용하여 SQLAlchemy와 연동하는 실습을 진행했습니다.
가독성이 좋고 쿼리문을 처리하는 것보다 사용성이 간편해서 사용하고 있습니다.
감사합니다.
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!