flask-sqlalchemy

햄도·2020년 12월 3일
0

Quick start

  1. 패키지 설치
    pip install flask_sqlalchemy
  1. db config
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy

    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:{계정}@{주소}/{DB명}'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 참고: https://github.com/pallets/flask-sqlalchemy/issues/365
    db = SQLAlchemy(app)
  1. model 상속 클래스 생성
    class Item(db.Model):
        __tablename__ = 'item'
        id = db.Column(db.Integer, primary_key=True)
        item_name = db.Column(db.String(250))
        item_id = db.Column(db.String(250))

        # __init__method는 SQLAlchemy가 자동 생성
        # def __init__(self, item_name, item_id):
        #     self.item_name = item_name
        #     self.item_id = item_id

    		# Super class의 생성자를 override하고 싶은 경우 
    		def __init__(**kwargs):
    				super(Item, self).__init__(**kwargs)
    				# 위와 같이 Super class의 생성자를 먼저 호출하고, 추가 작업 진행

        def __repr__(self):
            return "<Item('%d', '%s', '%s', '%s')>" % (self.id, self.item_name, self.item_id)
  1. table, database 생성
    db.create_all()
  1. 데이터 생성
    item_1 = Item(item_name='레인보우라이트 50+ 멀티비타민 미니-타블렛', item_id='123456')
    item_2 = Item(item_name='멀티비타민앤미네랄 영양제 보충제 포틴', item_id='654321')

    db.session.add(item_1) 
    db.session.add(item_2)
    db.session.commit()
  1. 쿼리
    # table 전체 쿼리
    Item.query.all()

    # 조건 쿼리
    User.query.filter_by(username='admin').first()
  1. Relationship 생성
    from datetime import datetime

    class Post(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(80), nullable=False)
        body = db.Column(db.Text, nullable=False)
        pub_date = db.Column(db.DateTime, nullable=False,
            default=datetime.utcnow)

        category_id = db.Column(db.Integer, db.ForeignKey('category.id'),
            nullable=False)
        category = db.relationship('Category',
            backref=db.backref('posts', lazy=True))

        def __repr__(self):
            return '<Post %r>' % self.title

    class Category(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(50), nullable=False)

        def __repr__(self):
            return '<Category %r>' % self.name
    py = Category(name='Python')

    # Post object는 Category add 시 함께 추가되기 때문에 별도로 추가할 필요 x
    Post(title='Hello Python!', body='Python is pretty cool', category=py)
    p = post(title='Snakes', body='Ssssss')
    py.posts.append(p)
    db.session.add(py)

plain SQLAlchemy와의 차이

  • SQLAlchemy는 다음과 같은 것들에 접근할 수 있도록 한다.
    • sqlalchemy와 sqlalchemy.orm의 함수 및 클래스들
    • preconfigured scoped session called session
    • metadata
    • engine
    • SQLAlchemy.create_all(), SQLAlchemy.drop_all()을 이용한 테이블 생성, 삭제
    • Model base class
  • Model declarative base class는 일반적인 파이썬 클래스처럼 동작하지만, 모델에 쿼리를 보낼 수 있는 query 속성이 존재한다.
  • Flask-sqlalchemy에서는 session을 commit해야 하지만, remove는 하지 않아도 된다. Flask-sqlalchemy가 자동으로 해결해준다.

참고

https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/#a-minimal-application

profile
developer hamdoe

0개의 댓글