Database management using model

JeongChaeJin·2022년 12월 14일
0

점프 투 fastapi

목록 보기
2/4
  • DB 사용 시 SQL이라는 구조화된 질의를 작성하고 실행해야한다. But ORM을 이용함으로써 SQL을 사용하지 않고, python code로 DB를 CRUD 한다.
insert into question (subject, content) values ('안녕하세요', '가입 인사드립니다 ^^');
insert into question (subject, content) values ('질문 있습니다', 'ORM이 궁금합니다');
question1 = Question(subject=’안녕하세요’, content='가입 인사드립니다 ^^')
db.add(question1)
question2 = Question(subject=’질문 있습니다’, content='ORM이 궁금합니다')
db.add(question2)
  • 참조 : 점프 투 Fast API
  • 위 insert 문은 sql, 그 아래 code는 ORM을 이용한 python code이다.
  • ORM 사용 시, SQL을 따로 배울 필요도 없고, DB 종류에 상관 없이 일관성있는 코드를 유지할 수 있어 유지보수에 용이하다.

Setting

pip install sqlAlchemy
  • FastAPI 에서는 sqlAlchemy를 사용한다.
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./myapi.db"

engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()
  • database.py 에서 DB에 대한 설정을 한다.
  • SQLALCHEMY_DATABASE_URL : Database 접속 주소
  • SessionLocal : Database 접속을 위한 Class
    • engine, sessionmaker를 사용하는 방식은 sqlAlchemy를 사용하는 정해진 방식이므로 숙지해 놓아야한다.
    • autocommit을 False로 했을 시, 데이터 변경 시 사인을 줘야 실제 저장이 된다. True로 하면, 사인 없이 저장되어서 편할 것 같지만 rollback이 불가능하다는 것에 주의한다.
    • create_engine은 커넥션 풀을 생성하며 커넥션 풀이란 DB에 접속하는 객체 수를 미리 만들어서 돌려가며 사용하는 것을 말한다. 이를 통해 DB 접속 세션 제어, 세션 접속에 소요되는 시간 절감이라는 이점을 얻는다.

Making model

  • 먼저, 각 도메인에 대한 모델 속성을 구상한다.

from sqlalchemy import Column, Integer, String, Text, DateTime

from database import Base


class Question(Base):
    __tablename__ = "question"

    id = Column(Integer, primary_key=True)
    subject = Column(String, nullable=False)
    content = Column(Text, nullable=False)
    create_date = Column(DateTime, nullable=True)
  • models.py 에 Question model을 만든 예시다.
  • model은 database에서 생성한 Base Class를 상속받아야 한다.
  • tablename : 관리될 테이블 명
  • Column의 첫 인자는 DataType이며 primary_key, nullable을 설정할 수 있다.
    • Integer : 숫자값
    • String : 글자수 제한된 글자
    • Text : 글자수 제한이 없는 글자
    • DateTime : 보통 작성 일시에 사용
    • primary_key : 중복된 값을 없게 만들어주는 설정, 기본 키로 설정하면, Data type이 Integer인 경우, 값이 자동으로 증가하는 속성이 있어서 데이터 저장 시, 세팅하지 않아도 1씩 자동 증가한다.
    • nullable : 데이터 저장 시 null 값 허용 여부. default는 True다.
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey
from sqlalchemy.orm import relationship

from database import Base

...

class Answer(Base):
    __tablename__ = "answer"

    id = Column(Integer, primary_key=True)
    content = Column(Text, nullable=False)
    create_date = Column(DateTime, nullable=False)
    question_id = Column(Integer, ForeignKey("question.id"))
    question = relationship("Question", backref="answers")
  • Answer는 위와 같이 model을 짤 수 있다.
  • question_id은 질문을 답변과 연결하기 위한 속성이다. 또한 이럴 때는 ForeignKey를 사용해야한다. 이는 database에서 기존 model과 연결된 속성을 나타내는 것을 의미한다.
    • ForeignKey에서 question.idquestion table의 id Column을 의미한다. 이를 통해 question_idquestion table의 id Column과 연결된 것이다.
  • "answer" table의 question 속성은 질문 모델을 참조하기 위한 수단이다.
    • relationship 사용 시, answer.question.subject 이런 식으로 참조/접근이 가능해 지는 것이다. 첫 파라미터는 참조할 모델 명이고, 두 번째 backref역 참조 설정이다. question에 여러 answer가 달릴 수 있는데, 역참조를 하면, question에 대한 answer들을 a_question.answers 와 같은 코드로 참조할 수 있다.
  • 제공하는 속성들은 공식문서에 많이 있으니 참고하자.

Table Createion using model

Setting

pip install alembic
  • database table을 생성하기 위한 라이브러리다.
  • SQLAlchemy 기반 작성 모델들을 쉽게 table로 관리할 수 있게 해준다.
alembic init migrations
  • 초기화 작업 진행
.
├── alembic.ini
├── database.py
├── frontend
├── main.py
├── migrations
├── models.py
├── README.md
└── requirements.txt
  • alembic.ini, migrations가 생성된다.
    • migrations directory는 revision 파일을 저장하는 용도다.
      • table 에서 변경이 발생하면, 작업 파일이 생기는데 이를 revision file이라 한다.
    • alembic.ini file은 alembic 설정을 위한 파일이다.
...
sqlalchemy.url = sqlite:///./myapi.db
...
  • alembic.ini 에서 sqlalchemy.url을 우리가 사용할 db 주소로 바꿔준다.
...
import models

...
target_metadata = models.Base.metadata
...
  • migrations/env.py 에서 해당 코드를 추가한다.

Creation

alebic revision --autogenerate
  • 이 명령어를 실행해준다.
  • 해당 명령어 수행 시 , migrations/versions에 무작위 해싱번호가 붙어있는 .py 파일이 생성된다. 해당 파일이 revision file이다.
alembic upgrade head
  • 이후 위 명령어를 수행한다. 이 때 myapi.db 가 생성될 것이다.
  • 명령어 수행 시, model에 정의했던 question, answer 라는 이름의 table이 db에 생성되었을 것이다.

  • 나는 dbeaver를 사용해서 myapi.db안의 테이블 생성을 확인했다.
profile
OnePunchLotto

0개의 댓글