본문 바로가기

데이터 분석/Flask

Flask - SQLAlchemy(ORM)

728x90

ksh950510.tistory.com/16

 

Flask - 2. Forms and User Input

ksh950510.tistory.com/15 Flask 기본설정 1. Flask 설치 및 설정 $ pip install flask 1-1) 제대로 설치 되었는지 확인하기 # on python import flask 오류가 발생하지 않으면 제대로 설치된 상태입니다. 1-2) ap..

ksh950510.tistory.com

이후의 내용을 다루고 있습니다.


ORM 이란?

- 객체 관계 매핑(Object-relational mapping; ORM)의 약자로 간단히 말해서,

데이터베이스 내의 리소스(테이블)들을 체화하여, 각 DBMS(MySQL, MSSQL 등)들에 대해서 CRUD 등을 공통된 접근기법으로 사용할 수 있다. 대표적인 Python ORM Django 자체적인 ORM  SQLAlchemy 등이 있다.

 

- ORM 장점:

1) 위에서 언급했던 내용과 같이, 프로그래머는 DBMS에 대한 큰 고민없이, ORM에 대한 이해만으로 웬만한 CRUD를 다룰 수 있기 때문에, 비즈로직에 집중할 수 있으므로 개발 생산성을 증가시킬 수 있다.

2) 객체를 통하여 대부분의 데이터를 접근 및 수정을 진행하므로, 코드 가독성이 좋다.

3) 데이터 구조 변경시, 객체에 대한 변경만 이루어지면 되므로, 유지보수성이 좋다.

 

- ORM 단점: 

1) 복잡한 쿼리 작성시, ORM 사용에 대한 난이도가 급격히 증가한다.

2) 호출 방식에 따라, 성능이 천차만별이다.

3) DBMS 고유의 기능을 전부 사용하지는 못한다.

 

위의 단점들이 있음에도 불구하고, ORM은 여전히 프로그래머한테 매력적인 기법이다.

대표적인 Python 웹 프레임워크 중 하나인, Flask에서 SQLAlchemy ORM을 통한 기본적인 CRUD를 구현해보겠습니다.

 

ORM 장단점 출처 : developer-stories.tistory.com/10

 

 

ORM은 관계형 매퍼이며, 기본적으로 데이터베이스에 엑세스하고 객체지향방식을 사용하기 쉽습니다.

가장 큰 장점은 python 코드를 변경하지 않고 다른 데이터베이스를 사용할 수 있습니다.

 

즉 SQLite database를 테스트에 사용하고 Postgres database를 실제 모델에 적용한다고 가정했을때,

두 데이터베이스를 연결하려면 SQLAlchemy에 각각의 데이터베이스 URL을 전달하기만 하면 됩니다.

이 장점들 때문에 최근에 많이 쓰이는것 같습니다.

 

이번 포스트에서도 SQLite 데이터베이스를 사용하여 개발한 후

app을 배포할 준비가 됐다면 Postgres 데이터베이스로 이동할것입니다.

 

1. SQLAlchemy 설치 및 적용

$ pip install flask_sqlalchemy
from flask import Flask, render_template, flash, redirect, url_for
from flask_sqlalchemy import SQLALchemy #sqlalchemy 불러오기
from forms import RegistrationForm, LoginForm

app = Flask(__name__) 


app.config['SECRET_KEY'] = 'e89733e7694e28f0c3e4d79de2268d70'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'

 

 

DB 만들기

$ python
$ from Flask_app import db
$ db.create_all()
# db 생성

현재 디렉터리에 site.db 파일이 생긴걸 확인할 수 있습니다.

지금은 비어있는 파일로 데이터를 추가해줘야합니다.

 

User와 Post를 가져와서 인스턴스 생성

$ python
$ from Flask_app import User, Post

# 먼저 User 인스턴스 생성
# 자동으로 할당하는 고유 id와 기본값이 정해진 칼럼외에는 다 설정해줘야 합니다.
$ user_1 = User(username='kim', email='k@demo.com', password='password')

# 작성한 user를 db에 추가하는 코드
$ db.session.add(user_1)

$ user_2 = User(username='jane', email='j@demo.com', password='password')
$ db.session.add(user_2)

# 추가한 db는 꼭 커밋해주어야 db가 변경됩니다.
$ db.session.commit()

# 만약 이후에 user_3를 추가하고 커밋은 하지않는다면 user3는 db에 반영되지 않습니다

# 전부 삭제하려면
$ db.drop_all()
# 이후 재생성 해야 다시 사용할 수 있습니다.
$ db.create_all()

Query

 

$ python
$ User.query.all()
# [User('kim', 'k@demo.com', 'default.jpg'), User('jane', 'j@demo.com', 'default.jpg')]

$ User.query.first()
# User('kim', 'k@demo.com', 'default.jpg')

$ User.query.filter_by(username='kim').all()
# [User('kim', 'k@demo.com', 'default.jpg')]

$ user = User.query.filter_by(username='kim').first()
$ user
# User('kim', 'k@demo.com', 'default.jpg')

$ user = User.query.get(1)
$ user
# User('kim', 'k@demo.com', 'default.jpg')

$ user = User.query.get(2)
$ user
# User('jane', 'j@demo.com', 'default.jpg')

$ user.posts
# [] 
# 어떤 post도 작성하지 않았고, 연결되지 않은 상태

>>> user.id
2
>>> post_1 = Post(title= 'Blog 1', content='First Post Content!', user_id=user.id)
>>> post_2 = Post(title= 'Blog 2', content='Second Post Content!', user_id=user.id)
>>> db.session.add(post_1)
>>> db.session.add(post_2)
>>> db.session.commit()
>>> user.posts
[Post('Blog 1', '2021-03-26 16:25:34.960981'), Post('Blog 2', '2021-03-26 16:25:34.961979')]

>>> for post in user.posts:
...     print(post.title)
...
Blog 1
Blog 2
>>>

>>> post = Post.query.first()
>>> post
Post('Blog 1', '2021-03-26 16:25:34.960981')
>>> post.user_id
2
post 테이블에서는 user_id만 얻을 수 있습니다.

>>> post.author
User('jane', 'j@demo.com', 'default.jpg')
하지만 위와같이 relationship를 이용해서 post의 칼럼이 아닌 정보도 가져올 수 있습니다.
relationship을 이용하려면 backref를 선언한 인수를 사용해야 합니다.

'데이터 분석 > Flask' 카테고리의 다른 글

JSON (JavaScript Object Notation)  (0) 2021.03.30
Flask - 패키지 구조화  (0) 2021.03.27
HTTP  (0) 2021.03.26
Flask - 2. Forms and User Input  (0) 2021.03.25
Flask - 1. 기본설정, 템플릿, 부트스트랩  (0) 2021.03.23