본문 바로가기
교육, 대외활동, 봉사/엘리스 AI 트랙 2기

[엘리스 AI 트랙 2기] Day 18~20 - ORM과 Flask

by g0n1 2021. 7. 18.
728x90

ORM, SQL

SQL의 종류

SQLD 딸 때 공부한 것 같은데 까먹었다 ㅋㅋ
앞의 D를 Data가 아니라 Table로 바꿔서 생각하면 좀 더 이해하기 쉬운 것 같다.

종류 의미 명령어
DDL 데이터의 구조를 정의하는 언어이다 CREATE, ALTER, DROP, RENAME
DML  데이터 조작(조회, 입력, 수정, 삭제)를 하는 언어 SELECT, INSERT, UPDATE, DELETE
DCL 사용자의 권한을 조작한다....
는데 안 써봐서 솔직히 이해는 안 감 ㅎ
REVOKE, GRANT, TRUNCATE
TCL  내가 한 수정을 반영할 것인지, 다시 이전 버전으로 돌아갈지를 제어한다 COMMIT, ROLLBACK, SAVEPOINT

ORM

객체형태로 테이블을 매핑하는 것
파이썬 클래스의 속성으로 한 row의 칼럼들을 표현하는 것이다.

### __init__.py
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()


### user_model.py
from sqlalchemy import Column, String, Integer, Sequence
from model import Base

class User(Base):
    __tablename__ = "user"
    name = db.Column(db.String(20), primary_key=True)
    age = db.Column(db.Integer, nullable=False)
    
	def __init__(self, name, age):
    	self.name = name
        self.age = age

이런 식이나

### db_connect.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

### model.py
from db_connect import db
class User(db.Model):
    name = db.Column(db.String(20), primary_key=True)
    age = db.Column(db.Integer, nullable=False)
    
	def __init__(self, name, age):
    	self.name = name
        self.age = age

이렇게 두가지 방법이 있는데,
위는 __init__, user_model, main가 있는 구조였고
아래는 model, app, db_connect가 있는 구조였다.

솔직히 지금 시점에선 뭐가 어떻게 다른지 모르겠고, db_connect는 왜 거치고 이해가 가지 않는다.

ORM으로 쿼리 날리기(데이터 받기)

### db_connect.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()



### 어느 파일에서의 쿼리 날리기
from db_connect import db

# 좀더 명시적인 쿼리, 오더바이, 내림차순
db.session.query.filter(Model.name == name).order_by(Model.age.desc())

# 코드가 간결한 쿼리, 문자열(LIKE)
Model.query.filter(Member.name.like('송%')

# limit, offset 적용하기
Member.query.order_by(Member.age.desc()).limit(LIMIT_NUM).offset(OFFSET_NUM)

# 갯수 새기
cnt = Model.query.filter(Member.name.like('송%').count()

Flask

from flask import Flask, request, render_template, redirect
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from model import Base
from model.user_model import UserModel

engine = create_engine("sqlite:///main.db")
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine) # bind=engine으로 db랑 연결
session = Session()  # session cursor랑 비슷한 역할

app = Flask(__name__)

@app.route('/')
def hello():
	return render_template("main.html")

@app.route('/register')
def register():
    if request.method == 'POST':
        name = request.form['name']
        age = request.form['age']
        user = UserModel(name,age)
        session.add(user)
        session.commit()
    else:
        return redirect('/')
        
if __name__ == '__main__':
    app.run()

name이랑 age에 대한 검증과정이 있진 않지만, 이런 느낌으로 main.db에 추가할 수 있다.
정리하면서 보니 다른 테이블에 입력하는 건 잘 모르겠다.
-> 애초에 ORM으로 인스턴스를 생성하면서 어디에 들어갈지는 정해지는 것 같다???
-> 만약 아니면 쿼리문 짜서도 할 수 있으니 ㄱㅊ

Blueprint

블루프린트라는 것을 활용해서 각 테이블 별로, 혹은 모종의 기준으로 구분되는 함수들을 구분하여(모듈화하여) 유지보수를 좀 더 용이하게 해주는 객체이다.

1. 모듈에서 bp를 선언하고 관련 함수들을 @bp.route로 만들어준다.
    bp = Blueprint('register', __name__)

2. 하나의 bp객체를 main.py 혹은 app.py에서 import한다.

3. flask app에 등록한다.(app.register_blueprint(bp))

 

디렉토리 구조

여기 코치님께서 만드신 플라스크 프로젝트의 구조를 올려보려다가, 인터넷에 있을 것 같아 검색해보았더니 공식문서에 Layout?Structure에 대한 내용이 있길래 링크를 첨부한다.

https://flask.palletsprojects.com/en/2.0.x/tutorial/layout/

 

Project Layout — Flask Documentation (2.0.x)

Project Layout Create a project directory and enter it: $ mkdir flask-tutorial $ cd flask-tutorial Then follow the installation instructions to set up a Python virtual environment and install Flask for your project. The tutorial will assume you’re workin

flask.palletsprojects.com

 

 

728x90

댓글