[FastAPI] 2. SQLAlchemy

Judy·2023년 3월 15일
0

FastAPI

목록 보기
2/8

SQLAlchemy : python 에서 사용가능한 ORM 라이브러리 (≒ JS - TypeORM)

원본 출처 : 점프 투 플라스크

SQLAlchemy?

  • ORM(object relational mapping)을 지원하는 파이썬 데이터베이스 도구
  • 모델 기반으로 데이터베이스 처리
    • 모델 : 데이터를 다룰 목적으로 만든 파이썬 클래스

Why SQLAlchemy?

  • ORM(object relational mapping)을 이용하면 개발자가 SQL 쿼리를 직접 작성하지 않고 파이썬 문법만으로 데이터베이스를 처리할 수 있다.
  • ORM은 쉽게 말해 데이터베이스에 데이터를 저장하는 테이블을 파이썬 클래스로 만들어 관리하는 기술
  • 데이터를 관리하는 데 사용하는 ORM 파이썬 클래스 == 모델
  • 모델을 사용하면 내부에서 SQL 쿼리를 자동으로 생성해 주므로 직접 작성하지 않아도 된다.
    = 파이썬만 알아도 데이터베이스 처리를 할 수 있다.
  • ORM의 장점
    • 데이터베이스 종류에 상관 없이 일관된 코드를 유지할 수 있어서 프로그램을 유지·보수하기가 편리하다.
    • 내부에서 안전한 SQL 쿼리를 자동으로 생성해 주므로 개발자가 달라도 통일된 쿼리를 작성할 수 있고 오류 발생률도 줄일 수 있다.

Example

1. Query vs ORM

[question 테이블 구성 예]

  • Question 테이블 == 파이썬 테이블 == 모델
idsubjectcontent
1안녕하세요가입 인사드립니다 ^^
2질문 있습니다ORM이 궁금합니다
.........

[쿼리를 이용한 새 데이터 삽입 예]

# crud.py (or DAO Layer)

insertinto question (subject, content)values ('안녕하세요', '가입 인사드립니다 ^^');
insertinto question (subject, content)values ('질문 있습니다', 'ORM이 궁금합니다');

[ORM을 이용한 새 데이터 삽입 예]

# crud.py

question1 = Question(subject=’안녕하세요’, content='가입 인사드립니다 ^^')
db.session.add(question1)
question2 = Question(subject=’질문 있습니다’, content='ORM이 궁금합니다')
db.session.add(question2)

2. Create Model

[질문 모델 속성]

속성명설명
id질문 데이터의 고유 번호
subject질문 제목
content질문 내용
create_date질문 작성일시

[답변 모델 속성]

속성명설명
id답변 데이터의 고유 번호
question_id질문 데이터의 고유 번호(어떤 질문에 달린 답변인지 알아야 하므로 질문 데이터의 고유 번호가 필요하다)
content답변 내용
create_date답변 작성일시

질문 모델 생성하기

models.py 파일에 모델 클래스들을 정의하여 사용한다

from pyboimport db

classQuestion(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    subject = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)
  • Question과 같은 모델 클래스는 db.Model 클래스를 상속하여 만든다

    • 이 때 사용한 db 객체는 __init__.py 파일에서 생성한 SQLAlchemy 클래스의 객체.
  • Question 모델의 각 속성은 db.Column으로 생성

  • 데이터 타입

    • db.Column() 괄호 안의 첫 번째 인수

    • 속성에 저장할 데이터의 종류 결정

      • db.Integer : 고유 번호와 같은 숫자값
      • db.String : 글자 수가 제한된 텍스트
      • db.Text : 글자 수를 제한할 수 없는 텍스트
      • db.DateTime : 작성일시 (날짜, 시각)
  • 추가 속성

    • primary_key
    • nullable
      • nullable을 따로 설정하지 않으면 해당 속성은 기본으로 빈값을 허용.
      • 속성에 빈값을 허용하지 않으려면 nullable=False로 설정해야 한다.

More...
https://lowelllll.github.io/til/2019/04/19/TIL-flask-sqlalchemy-orm/

profile
NLP Researcher

0개의 댓글