어제 만들었던 이메일 발송 코드에서 빠진게 있어서.. 수정하려고 한다.
한주가 바껴서 다시 k-mooc 강의 까지 들어야되서.. 바쁘다..플젝도 해야되는데 강의도 들어야해..
email_auths 테이블의 email 컬럼에 unique key가 빠졌다..
models, alembic 파일 수정을 해준다.
models.py
email 부분에 unique=True 를 추가해준다.
class EmailAuth(Base):
__tablename__ = "email_auths"
id = Column(BigInteger, primary_key=True, index=True)
email = Column(String(255), unique=True)
code = Column(String(8))
저번에 작성했던 migration > versions > 8e37f3a48f38_create_email_auths_table.py
여기도 마찬가지로 추가해준다.
def upgrade():
# email_auths 테이블
op.create_table(
'email_auths',
sa.Column('id', sa.BigInteger, primary_key=True),
sa.Column('email', sa.String(255), nullable=False, unique=True),
sa.Column('code', sa.String(8), nullable=False),
)
그리고 1단계 전 단계인 마이그레이션 부분으로 취소해준다.
alembic downgrade -1
그럼 email_auths 테이블이 없어졌다
다시 마이그레이션 실행해준다.
alembic upgrade head
다시 생성 완료!!
이렇게 해서 유니크 키를 추가했지만
다음과 같이 중복한 email 이 들어가면 500에러가 발생하고 이메일도 발송하게 된다
이 부분을 수정해보자.
SQLAlchemy 에서 예외 처리를 해줄 수 있게 crud.py의 상단에 추가한다.
이 오류는 제약 조건을 위반했을때 발생하는 오류이라서
IntergrityError 로 임포트 해준다.
from sqlalchemy.exc import IntegrityError
알캐미 문서 너무 그지같다..
그 외 자주 사용 하는 예외 종류는
- SQLAlchemyError : 발생하는 모든 예외
- IntegrityError : 제약조건 위반
- OperationalError : 데이터베이스 연산 중 오류가 발생했을때
- DatabaseError : 데이터베이스 연결, 쿼리 실행 등
코드는 try / except 문을 쓰고 IntegrityError 로 잡아준다.
그리고 rollback 메소드로 트랜잭션을 롤백
def email_code(db: Session, email: EmailSend):
email_auth_data = email.model_dump()
db_email_auth = EmailAuth(**email_auth_data)
try:
db.add(db_email_auth)
db.commit()
db.refresh(db_email_auth)
except IntegrityError:
db.rollback()
return None
return db_email_auth
main.py 에서는
crud.py 에서 except로 None을 리턴해주면
아래 코드에서 조건문에 걸린다.
# 원래 코드
fm = FastMail(conf)
await fm.send_message(message)
email.code = code
email_code(db, email)
# 바뀐 코드
fm = FastMail(conf)
email.code = code
db_email_auth = email_code(db, email)
if db_email_auth is None:
return JSONResponse(status_code=400, content={"message": "이미 발송된 코드가 있습니다."})
await fm.send_message(message)
그럼 테스트를 해보면 이렇게 된다.
오늘은 k-mooc 강의 다 듣고 내일부터 기능개발 더 해야겠다.. ㅠㅠ
본 후기는 정보통신산업진흥원(NIPA)에서 주관하는 <AI 서비스완성! AI+웹개발 취업캠프 - 프론트엔드&백엔드> 과정 학습/프로젝트/과제 기록으로 작성되었습니다.
'코딩캠프 > AI 웹개발 취업캠프' 카테고리의 다른 글
[AI 웹개발 취업캠프] 73Day - 프로젝트 24일차 (0) | 2023.11.02 |
---|---|
[AI 웹개발 취업캠프] 72Day - 프로젝트 23일차 (0) | 2023.11.01 |
[AI 웹개발 취업캠프] 70Day - 프로젝트 21일차 (0) | 2023.10.30 |
[AI 웹개발 취업캠프] 69Day - 프로젝트 20일차 (0) | 2023.10.27 |
[AI 웹개발 취업캠프] 68Day - 프로젝트 19일차 (1) | 2023.10.26 |