개발자 구겹이

fastapi sqlalchemy 데이터베이스 연동 본문

python/PythonLang

fastapi sqlalchemy 데이터베이스 연동

@layers9 2024. 7. 31. 20:45

데이터베이스 연동을 할 때 기본적으로 설정해주어야 할 사항들

 

 

0. 엔진설정

 

1. 그들만의 규칙으로의 url 설정 

 

2. 테이블의 구조를 생성해줄 스키마 작성

 > Column이라는 속성을 사용하여 해당 컬럼의 데이터 타입과 길이 , 기본키로 쓸것인가 등을 설정해줌

 

 

3. session 생성에 대한 클라스객체와 이것을 인스턴스화

 

이미지 클릭 시 출처로 이동

 

4. middleware와 webserver 기능을 하는 각각의 import 거리들

 

 

 

fastapi sqlalchemy에서 사용할 수있는 엔진, 베이스, 쿼리 등의 제반사항들에 대해 

버전이 업될수록 간략화되어가고 있다.

 

최신 document를 읽어보면

아래의 코드들로 엔진 설정과 미들웨어, 세션 생성 등을 완료할 수 있다는 것을 알 수 있다.

 

 

 

 

 


            # 데이터베이스 연결을 위한 기본 생성 필요 사항들 db.py          

from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy import create_engine
from back.core.settings import settings
from sqlalchemy.ext.declarative import declarative_base
import logging
import aiomysql
import asyncio

logging .basicConfig(level=logging.DEBUG)

DATABASE = settings.database_url
ENGINE = create_engine(DATABASE,echo=True)

SESSION = scoped_session(sessionmaker(bind=ENGINE,autoflush=True,autocommit=False))

BASE = declarative_base()

BASE.query = SESSION.query_property()

 

 


 

 

              # 데이터를 저장할 테이블 구조를 정의 models.py            

from sqlalchemy import Column, String, TIMESTAMP
from datetime import datetime, timezone
from .connect import BASE

 

class UploadType(BASE): 
    __tablename__ = 'uploadtype'

    id = Column(String(20),primary_key=True,default="cccc")
    hp_logo = Column(String(255))
    color = Column(String(20),index=True)
    hp_name = Column(String(100),index=True)
    upload_time = Column(TIMESTAMP, index=True,default=datetime.now(timezone.utc))

 

 


 

 

         # 전체적으로 통일적인 환경설정을 위해 불러다쓸 정보들 settings.py         

from pydantic_settings import BaseSettings
import aiomysql
from typing import Any

class Settings(BaseSettings):
    app_name : str = 'app_name'
    debug: bool = False
    database_url : Any = 'mysql+{sqlconnector}://{username}t:{password}@l{host}t:{port}/{db_schema_name}'

    class Config:
        env_file = 'config.yaml'


settings = Settings()

 

 


     main.py      

 

 

from fastapi import FastAPI,Depends,Request,Form, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import HTMLResponse
from back.database.dbimport BASE,ENGINE,SESSION
from back.database.models import UploadType



app = FastAPI(debug=True)

app.add_middleware(
    CORSMiddleware,
    allow_origins=['*'],
    allow_credentials=True,
    allow_methods=['*'],
    allow_headers=['*'],
)

 

def remove_table():
    BASE.metadata.drop_all(ENGINE, checkfirst=True)           


def create_table():
    BASE.metadata.create_all(bind=ENGINE, checkfirst=True)

 

@app.on_event("startup")
async def startup_event():
    remove_table()
    create_table()

 

 

 

 

 

fastapi에서는 특별한 상황이 아니고서는 

유저가 데이터를 입력한 것을 전송하는데 get을 사용하지 않는다.

post를 사용하여 유저입력데이터를 request함

 

 

 

졸릴때는 자고 일어나기  ʅ(◞‿◟)ʃ