스파르타 코딩클럽 내일배움캠프 AI 웹개발자양성과정 3회차
2022.12.28. 84일차 - TIL
최종발표 전 발표자료 작성과 시연영상 촬영, 깃허브 정리 및 README.md 작성을 했다.
계획했던 테스트코드 작성은 시간이 애매해서 수료 후에 팀원들과 취업준비를 하면서 짜보기로 했다.
오늘 공부한 것
python에서 DB 행 삭제
최종발표 전 서비스 점검을 하다 한개의 축제게시글이 3개씩 나오는것을 발견했다.
도커를 이용해서 백엔드 서버를 구동하는 과정에서 festival_article 모델에 축제 정보를 저장시켜주는 festival_loader.py이 중복으로 실행되어 같은 축제가 3개씩 저장된것..
방법을 고민해봤는데 우리가 필요한 축제는 828개인데 이후 829번부터는 중복된 행이기 때문에 이것들을 다 삭제 해주면 해결될거라고 생각했다.
로컬이 아닌 배포한 서버 DB에서는 어떻게 삭제할 수 있을까 고민하다 두가지 방법을 생각했다.
- 축제 모델 DB에 csv 파일 내용을 저장해주었듯이 python 파일에 DB 행을 삭제하는 함수를 정의해서 동작
- PostgreSQL 클라이언트 툴을 설치해서 우리 주소를 입력해주고 해당 DB를 관리
2번은 우선 새로 프로그램을 설치해야하고 사용법도 숙달이 안되어있기 때문에 시간이 오래 걸릴거라고 판단해서 1번 방법을 택했다.
먼저 festival_delete.py를 생성해주었다. conn이라는 변수에 프로젝트의 db.sqlite3을 정의해주었다.
이후 Delete_Column() 함수를 정의해주었는데 sql="DELETE FROM festivals_festival_article WHERE id > 828"는 festivals_festival_article모델에서 id가 829보다 큰 행을 삭제한다는 의미이다.
import os
import django
import sqlite3
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bestchoice.settings")
django.setup()
conn = sqlite3.connect('db.sqlite3')
c = conn.cursor()
def Delete_Column():
sql = "DELETE FROM festivals_festival_article WHERE id > 828"
try:
c.execute(sql)
print("Success")
except Exception as e:
print("error: ", e)
finally:
conn.commit()
Delete_Column()
이후 도커 배포 과정에서 docker-compose.yml에 python festival_delete.py를 실행하도록 추가 설정 후 다시 서버를 구동하니 필요없는 행이 잘 삭제되었다.
그런데... 한가지 문제가 더 발생했다😥
삭제된 축제글에 연동되어 있는 모집게시글이 같이 삭제되지 않고 festival부분이 null로 넘어오면서 모집게시글이 오류가 뜨는것. 우선 이해가 되지 않은 부분은 분명 모집게시글 모델을 설계할때 축제모델을 외래키로 지정해주었고, on_delete=models.CASCADE도 설정되어 있어서 위 과정에서 삭제된 축제 게시글의 모집게시글도 같이 삭제될 줄 알았는데 삭제가 되지 않아서 오류가 발생했다.
원인을 이것저것 생각해봤지만 찾지 못했고, 우선 조치하는것이 우선이라고 판단해서 삭제된 축제게시글과 연동된 모집게시글을 DB에서 삭제하기로 했다. 위 방식과 동일하고 조건만 다르게 작성했다.
import os
import django
import sqlite3
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bestchoice.settings")
django.setup()
conn = sqlite3.connect('db.sqlite3')
c = conn.cursor()
def Delete_Column():
sql = "DELETE FROM joins_join_article WHERE id=6 OR id=7"
try:
c.execute(sql)
print("Success")
except Exception as e:
print("error: ", e)
finally:
conn.commit()
Delete_Column()
sql = "DELETE FROM joins_join_article WHERE id=6 OR id=7"
joins_join_article모델에서 id가 6이거나 7인 행을 삭제한다는 의미이다.
오류가 발생했던 모집 게시글을 삭제해주니 다른 게시글은 정상적으로 보이는 것을 확인했다.
왜 같이 삭제되지 않았는지는 튜터님께 질문해서 원인을 찾아보고 차후 어떻게 모델을 설계하는게 좋을지 생각해봐야겠다.
'개발일지 > AI 캠프' 카테고리의 다른 글
내일배움캠프 AI - 85일차 TIL, 2022.12.29 (0) | 2023.01.03 |
---|---|
내일배움캠프 AI - 83일차 TIL, 2022.12.27 (0) | 2022.12.28 |
내일배움캠프 AI - 82일차 TIL, 2022.12.26 (0) | 2022.12.26 |
내일배움캠프 AI - 17주차 WIL (0) | 2022.12.25 |
내일배움캠프 AI - 81일차 TIL, 2022.12.23 (0) | 2022.12.24 |