[웹개발] 04. Flask 다시 배우기 - model, sqlalchemy

Flask를 다시 공부하면서 헷갈리는 부분이나 새로 배운 내용을 정리한다.

Flask에서 DB 다루기

1. model 설계하기 및 연관관계 설정하기

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    userid = db.Column(db.String(12))
        
class Model_detail(db.Model):
    __tablename__ = 'model_detail'

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) # User 테이블에서 id값을 외래키로 사용
    model_name = db.Column(db.String(12))
    user = db.relationship('User', backref='model_detail', lazy=True) 
    # backref 를 사용하여 User에서 역참조를 허용(ex.user_1.model_detail)

2. 데이터베이스 생성하기

  • config.py에 설정 추가
SQLALCHEMY_DATABASE_URI = 'sqlite:///XXXX'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = False
  • ORM 적용하기
# __init__.py
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db = SQLAlchemy()
migrate = Migrate()

def create_app():
  .....
  db.init_app(app)
  migrate.init_app(app,db)
  .....
  return app
  • db 초기화 및 모델 변경값 적용하기

# 데이터베이스 초기화
flask db init

# 리비전파일 생성하기
flask db migrate

# 데이터베이스 갱신
flask db upgrade

3. 데이터 다루기

  • 데이터 저장하기
db_1 = User(userid = 'hwangtoemat')
db.session.add(db_1)
db.session.commit(db_1)

데이터에 변경사항이 있을 경우 위와같은 과정을 거쳐야 변경사항의 저장이 완료된다.

  • 데이터 조회하기
User.query.all() # 아래와 같이 모든 객체를 리스트에 담아서 리턴
[<User 1>, <User 2>]
User.query.first() # 쿼리의 첫번째 값을 리턴
User.query.get(1) # id가 1인 값을 조회(id 가 유일한 값이기 때문에 가능)
User.query.filter(user.userid =='hwangtoemat').all() # 조건에 맞는 모든 값 조회
User.query.filter(user.userid.like('%toe%')).all() # 'toe'가 들어가는 아이디를 가진 모든 값 조회
  • 데이터 삭제하기
db_2 = User.query.filter(user.userid.like('%toe%')).first()
db.session.delete(db_2) # 조건에 맞는 값 삭제
db.session.commit(db_2) # 데이터에 반영
  • 연관관계에 맞게 데이터 생성하기
temp = User.query.get(1)
db_3 = Model_detail(user = temp, model_name = 'SVM_2') # user_id는 temp에 의해 자동 입력
db.session.add(db_3)
db.session.commit(db_3)

© 2020. All rights reserved.