본문 바로가기
개발관련/FastAPI(BE)

FastAPI - (4) DB 연결하기

by yjoo_ 2023. 10. 16.

 

https://fastapi.tiangolo.com/tutorial/sql-databases/

 

SQL (Relational) Databases - FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com

 

이번 시간에는 DB를 연결해보자

 

SQLModel을 이용해 관계형 데이터베이스를 연결한다. NOSQL은 추후에 외전 편에서 다룰 예정이다.


 

pip install fastapi "uvicorn[standard]" SQLModel

이번에 필요한건 이 세가지다.

 

중요한건 SQLModel은 파이썬 3.8 이상 버전부터 지원하니 파이썬 버전을 잘 확인하여 사용하도록 하자.

 

가상환경에 접속해 세가지를 설치한 뒤 main.py를 열고 fastAPI인스턴스를 만들어주자

from fastapi import FastAPI

app = FastAPI()

if __name__ == "__main__":
	import uvicorn
	uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)

 

 

FastAPI는 관계형 데이터베이스를 사용할 필요가 없다. (공식 문서)

 

이게 무슨 말이냐면, FastAPI는 자체적으로 DB를 관리하거나 제공하는 기능이 없기 때문에

 

어떤 데이터베이스든 사용해도 괜찮다는 말이다.

 

아직 많은 사람들이 DB를 배울 때 관계형 DB를 공부하기 때문에 이번엔 관계형 DB를 사용하지만

 

NOSQL 데이터베이스가 필요한 상황이 나온다면 사용해야 한다.

 

꼭 시간을 내어 공부해보길 바란다.

 

SQLModel

앞에서도 말했듯 FastAPI는 자체적으로 제공하는 DB가 없다.

 

그래서 ORM(Object Relational Mapping)을 지원하는 SQLAlchemy같은 라이브러리를 사용해야 한다.

 

 

SQLModel은 FastAPI 개발자가 만들었다.

 

SQLAlchemy는 파이썬 ORM 라이브러리이지만, FastAPI와는 다른 모델 선언방식을 사용한다.

 

그래서 FastAPI 개발자는 같은 선언 방식을 갖추기 위해, SQLModel을 만들었다.

 

본격적으로 DB를 연결해보자

database디렉토리를 만들어주고 안에 connetion.py를 만들어준다.

 

데이터베이스는 서버형 DB단일 DB파일 등을 지원한다.

 

서버형 DB의 경우 리눅스 서버에 설치하고, 계정을 생성해 서버에서 동작한다.

대표적으로 MySQL, MriaDB, PostgreSQL이 있다.

 

단일 DB 파일은 SQLite가 대표적이다. 이번 시간에는 SQLite로 DB를 생성할 것이다.

 

코드를 작성해주자.

 

from sqlmodel import create_engine

# sqlite 파일명
database_file = 'sqlite3.db'
# sqlite를 생성하는 SQLAlchemy 문법 '/' 3개는 상대경로 4개는 절대 경로를 뜻한다.
sqlite_url = f"sqlite:///{database_file}"
# create_engine함수를 사용하여 DB에 연결하도록 경로를 연결함
# echo는 SQL 실행 구문이 모두 서버로그에 띄워지도록 세팅한다.
engine = create_engine(sqlite_url, echo=True)

기초적인 선언은 끝났으니, 실제로 실행할 함수를 선언해보자

 

from sqlmodel import SQLModel, create_engine


database_file = 'sqlite3.db'

sqlite_url = f"sqlite:///{database_file}"

engine = create_engine(sqlite_url, echo=True)


def conn():
	# DB에 연결하여 선언된 테이블들이 존재하는지 확인하고
    # 없다면 테이블들을 생성해준다.
	SQLModel.metadata.create_all(engine)

DB에 테이블을 정의했으니 어플리케이션이 실행될 때 해당 함수가 실행되도록 세팅해보자.

 

실행 파트인 main.py에 가서 on_startup 함수를 선언해준다.

from fastapi import FastAPI
from database.connetion import conn

app = FastAPI()

# 이 함수는 어플리케이션이 실행 될 때 딱 한번 실행된다.
@app.on_event("startup")
def on_startup():
	# connetion.py에 선언해준 conn함수를 실행시켜 DB를 연결해준다.
	conn()

if __name__ == "__main__":
	import uvicorn
	uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)

가장 간단한 형태의 DB다.

 

여기까지 선언했다면 서버를 실행시켜보자

우린 까먹은게 있다.

conn함수를 찾을 수 없다고 한다. 경로를 제대로 지정해줬는데 왜일까??

 

바로 __init__.py가 없어서 그렇다. __init__.py는 파이썬에서 디렉토리가 패키지로 인식되는 역할을 한다.

그냥 파일을 만들어주기만 하면된다.

아주 잘 된다.

자 DB파일을 열어보면 그냥 빈 깡통일 것이다.

 

아직 DB를 사용하는 라우터도 없고 모델도 선언하지 않았다.

 

그래서 테이블도 없다. 사용하려면 또 선언을 해주어야한다.

 

그것은 다음 시간에 Model을 다루면서 정리해보도록 하겠다.

 

 Reference

SQLModel
https://sqlmodel.tiangolo.com/databases/

파이썬에서 __init__py의 역할

https://anodos.tistory.com/entry/Python%EC%97%90%EC%84%9C-initpy-%ED%8C%8C%EC%9D%BC%EC%9D%98-%EC%97%AD%ED%95%A0

 

'개발관련 > FastAPI(BE)' 카테고리의 다른 글

FastAPI - (5) Model  (0) 2023.10.19
FastAPI - (3) Request Body  (0) 2023.10.10
FastAPI - (2) HTTP메소드, URL 매개변수  (1) 2023.10.07
FastAPI - (1) 개념 및 설치  (2) 2023.10.06