A ship in harbor is safe, but that is not what ships are built for.

개발일지/AI 캠프

내일배움캠프 AI - 84일차 TIL, 2022.12.28

플리피나리 2023. 1. 3. 19:56
반응형

스파르타 코딩클럽 내일배움캠프 AI 웹개발자양성과정 3회차

2022.12.28. 84일차 - TIL

 

 

최종발표 전 발표자료 작성과 시연영상 촬영, 깃허브 정리 및 README.md 작성을 했다.
계획했던 테스트코드 작성은 시간이 애매해서 수료 후에 팀원들과 취업준비를 하면서 짜보기로 했다.

오늘 공부한 것

python에서 DB 행 삭제

최종발표 전 서비스 점검을 하다 한개의 축제게시글이 3개씩 나오는것을 발견했다.
도커를 이용해서 백엔드 서버를 구동하는 과정에서 festival_article 모델에 축제 정보를 저장시켜주는 festival_loader.py이 중복으로 실행되어 같은 축제가 3개씩 저장된것..
방법을 고민해봤는데 우리가 필요한 축제는 828개인데 이후 829번부터는 중복된 행이기 때문에 이것들을 다 삭제 해주면 해결될거라고 생각했다.
로컬이 아닌 배포한 서버 DB에서는 어떻게 삭제할 수 있을까 고민하다 두가지 방법을 생각했다.

  1. 축제 모델 DB에 csv 파일 내용을 저장해주었듯이 python 파일에 DB 행을 삭제하는 함수를 정의해서 동작
  2. 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인 행을 삭제한다는 의미이다.
오류가 발생했던 모집 게시글을 삭제해주니 다른 게시글은 정상적으로 보이는 것을 확인했다.
왜 같이 삭제되지 않았는지는 튜터님께 질문해서 원인을 찾아보고 차후 어떻게 모델을 설계하는게 좋을지 생각해봐야겠다.

반응형