파이썬 이것저것/파이썬 백엔드

[Flask] Flask + mysql 연결

agingcurve 2024. 7. 21. 12:25
반응형

Flask에서 DB와 연결을 하려면 여러 방법이 있지만, 일반적으로 많이 사용되는 것은 SQL-Alchemy를 사용하여 연결하는 것이다.

 

SQL-Alchemy는 객체-관계 매핑을 제공하여 파이썬 클래스를 데이터베이스 테이블과 연결을 통해 보다 직관적이고 유지관리를 쉽게 해준다.

 

데이터베이스 종류는다양하지만, 일반적으로 많이 사용되는 MySQL을 사용한다고 가정한다.

Flask에서  DB를 접속하려면, Flask-SQLAlchemy와 mysql연결을 위한 pymysql을 설치한다.

 

 - 필요한 패키지 설치

pip install Flask
pip install Flask-SQLAlchemy
## db 종류에 따라 선택해서 설치하면 됨
pip install pymysql

 

 

 - 사전 환경설정

먼저 PC에 MySQL을 설치하고, MySQL에 접근하여 SQL 명령으로 데이터 베이스를 생성한다.

로컬에 DB를 설치해도 되고, Dokcer로 설치해서 해볼 수도 있다. 

Docker로 컨테이터를 만들어서 작업을 진행해보자.

 

컨테이너 제작 명령어

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest

 

3306 port로 컨테이너가 생성되었다

 

컨테이너에 접속해서 mysql에 접속해보자

 

컨테이너 생성

docker exec -it mysql-container

mysql 접속

mysql -u root -p
## 설정한 비밀번호 입력

 

 

DB를 생성,

CREATE DATABASE db_name;

 

DB가 제대로 생성되었는지 확인해보자

SHOW DATABASES;

 

이제 다시 파이썬으로 돌아와서 접속을 시도 해보자,

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'
db=SQLAlchemy(app)

 

SQLALCHEMY_DATABASE_URI에 들어가는 인자는 다음과 같다.

mysql+pymysql: DBAPI를 설정, mysql은 사용하려면 데이터베이스의 종류를 나타내며, pymysql은 SQLAlchemy가 실제 데이터베이스와 통신하는 데 사용할 파이썬 라이브러리이며, mysql+pymysql 뜻은 SQLAlchemy에게 Mysql을 사용하고 그 통신에는 pymysql 라이브러리를 사용한다는 의미

username:password: mysql에 설정된 userid 와 password 설정

localhost : mysql 서버의 주소이며, 로컬에서 실행하는 경우 일반적으로 localhost임

db_name : 접속할 데이터베이스 이름설정해주면됨

 

 

모델 생성 및 CURD 구현

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost/db_name'
db=SQLAlchemy(app)

class User(db.Model):
    # 테이블 이름 직접 지정 이 부분을 생략하면 기본적으로 클래스 이름을 소
    # 문자화 한 user가 만들어짐
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username
    
# 앱 컨텍스트 안에서 DB 테이블 생성
with app.app_context():
    db.create_all() # 모델 클래스에 정의된 모든 테이블을 데이터베이스에 생성 -> 애플리케이션 첫 실행시 주로 사용

# 라우트 정의
@app.route('/')
def index():
    # 데이터 생성(CREATE)
    new_user = User(username = 'jxxhons', email= 'jxxhons@example.com')
    db.session.add(new_user)
    db.session.commit()

    # 데이터 조회
    user = User.query.filter_by(username='jxxhons').first()

    # 데이터 업데이트(Update)
    user.email = 'jxxhonsnew@newexample.com'
    db.session.commit()

    # 데이터 삭제
    db.session.delete(user)
    db.session.commit()

    return 'CURB opreations completed!'

 

SQLalchemy 주요 문법

데이터 읽기 시, 가장 기본적인 방법은 query객체를 사용하는 것임

# User.query : User 모델에 대한 query 객체를 생성
# filter_by(username='jhon') username이 john인 레코드 필터
# first() 필터링된 레코드 중 첫 번째 레코드
# 조건에 맞는게 없다면 None을 반환한다.
user = User.query.filter_by(username='john').first()

 

모든 레코드 가져오기

all() 메서드 사용

users = User.query.all()

 

기본키(primary key)를 알고 있다면 get 메서드를 사용할 수 있음 없으면 None을 반환

users = user.query.get(1) # id가 1인 User 레코드를 가져옴

 

 

sqlalchemy에 대한 문법은 해당사이트에서 찾아 볼 수 있다.

https://docs.sqlalchemy.org/en/20/orm/quickstart.html

 

ORM Quick Start — SQLAlchemy 2.0 Documentation

ORM Quick Start For new users who want to quickly see what basic ORM use looks like, here’s an abbreviated form of the mappings and examples used in the SQLAlchemy Unified Tutorial. The code here is fully runnable from a clean command line. As the descri

docs.sqlalchemy.org

 

'파이썬 이것저것 > 파이썬 백엔드' 카테고리의 다른 글

[python] Flask 배포하기  (0) 2024.08.03
[python] Flask Restapi 구현  (0) 2024.07.27
[Python] Flask 세션과 쿠키  (0) 2024.07.21