본문 바로가기

FASTAPI 사용을 위한 SQLAlchemy(ORM) 기초 - 1탄 초기설정, 데이터 입력하기

ironwhale 2022. 7. 4.

다시 정리하는 SQL 알케미

본 내용은 https://fastapi.tiangolo.com/ko/tutorial/sql-databases/ 해당 링크의 설명과 공식문서를 참조하였습니다.

 

이전에 2021.08.16 - SQLALCHEMY를 이용한 PostgreSQL 사용법 을 정리한적이 있었습니다. 

 

SQLALCHEMY를 이용한 PostgreSQL 사용법

SQL 알케미랑 SQL 서버와 연결하는 부분 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker URL = "postgresql://아이디:비밀번호@서버주소/DB이름" engine = create_engine(URL,ech..

jh-industry.tistory.com

기억도 가물가물하고 ORM 안쓰고 그냥 SQL로 직접 한다고 했는데 이대로 포기하는것은 아쉬워서 다시 한번 정리하면서 머리속에 집어 넣어 보려고합니다. SQLAlchemy는 python으로 sqlite, Mysql 등을 사용하는데 꼭 필수는 아니지만 알아두면 여러모로 쓸모가 있는 라이브러리 입니다. 특히 FastAPI로 백엔드 서버를 구현할때 공식문서에도 자세한 설명이 나오고 flask를 사용할때는 사용되는 라이브러리 입니다. 

 

깊숙한 내용보다는 가볍고 그때그때 필요할때 요점만 보려는 의도로 작성하였습니다. 


SQLALCHEMY의 시작은 Engine

  • 엔진과 세션을 우선 만듭니다.
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, sessionmaker

SQL_URL = "sqlite:///./sql_app.db"
engine = create_engine(SQL_URL, echo=True,connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False,autoflush=False,bind=engine)

Base = declarative_base()
  • SQLALCHEMY를 시작은 engine이고 이것은 create_engine 으로 만듭니다.
  • 그리고 engine을 관리하기 위한 것이 session 인데 sessionmaker 로 만듭니다.
  • declarative_base 는 테이블을 만들때 쓴다고 알고 넘어가시면 됩니다.
    • 추후 Base는 테이블 만들때와 Base.metadata.create_all(bind=engine)

SQLALCHEMY ORM 테이블을 만들기

  • 밑에 코드와 같이 간단하게 테이블을 만들어 보았습니다.
  • foreign key도 만들수 있으니 자세한것은 공식 문서를 참조해주시기 바랍니다.
  • 아울러 기존에 있는 DB의 테이블을 불러올수 있는 Table Reflection 기능도 있습니다.
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String

class User(Base):
    __tablename__ = "users"
    
    id = Column(Integer,primary_key = True, index =True)
    email = Column(String,index =True)
    is_active = Column(Boolean, default= True)
  • __tablename__ 은 실제 DB에 생성되는 테이블의 이름입니다.

번외 pydantic을 이용한 데이터 입력

  • fastapi 사용을 염두에 두고 진행하다 보니 pydantic 관련 내용도 조금 언급하겠습니다.
  • pydantic은 입력데이터가 제대로 들어왔는지 보장하는 것이 아니라 출력되는 데이터의 타입을 보장하는 라이브러리 라고 합니다.
  • 만약, email에 숫자 123을 입력하면 123을 str 형으로 바꿔주는 기능을 하는 것이죠
from pydantic import BaseModel

class UserCreate(BaseModel):    
    email: str       
   
    class Config:
        orm_mode =True
  • orm_mode =True로 하게되면 user.email로 데이터에 접근이 가능하게 된다고 하네요

pydantic으로 데이터 입력후 객체 생성

  • 실제로는 fastapi를 이용해서 데이터를 입력하지 아래와 같이 입력하지는 않지만 참고하시기 바랍니다.
data = {
    "email":"tes2112@test.com",
}
user = UserCreate(**data)

print(user.email) ## output tes2112@test.com

자료를 DB에 입력하기(Create)

  • 나중에 fastapi 튜토리얼과 같이 파일로 나누어서 코드를 정리할 예정이지만 일단은 한곳에 몰아서 써보도록 하겠습니다.
from sqlalchemy.orm import Session

def create_users(db:Session,user:UserCreate):
    filtered_user = db.execute(select(User).filter(User.email==user.email)).scalars().first()    
    if filtered_user==None: 
        db_user = User(email=user.email)
        db.add(db_user)
        db.commit()
        db.refresh(db_user)
        return db_user
    else:
        print(f"'{filtered_user.email}' Exist email !!")
  • 테이블을 정의할때 만든 User 클래스에 우리가 입력하고자하는 email을 넣어 db_user 객체를 만듭니다.
  • db:Session은 이따가 만들 db = SessionLocal() 을 의미합니다.
  • db.add(db_user)를 통해 db에 데이터를 입력하고 commit을 해야 실제 데이터가 입력 됩니다.

SQLALCHEMY 실제 작동

지금까지 SQLALCHEMY를 사용하기위한 사전작업을 모두 마쳤습니다.

 Base.metadata.create_all(bind=engine)
 db = SessionLocal()
 result = create_users(db=db,user=user)

 result.email ## 입력한 이메일이 출력됩니다. 
 db.close()
  • Base.metadata.create_all(bind=engine)을 통해 실제 데이터베이스에 DB를 만듭니다.
  • db = SessionLocal() 을 통해 세션을 만들어 줍니다. 이것은 추후 Fastapi 서버를 만들때 dependency with yield 방식으로 구현할 예정입니다.
  • create_users 함수에 세션과 입력할 데이터를 집어넣어 실행만 해주면 실제 DB에 저장이 될것입니다.

댓글