가끔 배치 파일로 처리할 필요가 있다.
python manage.py runserver
처럼 간단하게 자기 명령어를 만들어서 수행할 필요가 있다.
아주 잘 정리되어 있는 글이 있다.
나도, 빙 코파일럿을 이용해서 초안을 더 작성해 봤다. 엑셀 파일 명을 받아서 DB 에 입력하는 예제를 만들어 달라고 요청하고 정리해봤다.
Django에서는 사용자가 커스텀 manage.py
명령어를 만들 수 있습니다.
이를 위해서는 Django 앱 내에 management/commands
디렉토리를 추가하고 해당 디렉토리 내에 실행하고 싶은 커맨드를 my_command.py
와 같은 형식으로 만들어주면 됩니다. 이렇게 등록해주면 프로젝트의 루트 디렉토리에서 python manage.py my_command
와 같이 실행할 수 있습니다.
커맨드의 기본 형식은 다음과 같습니다.
BaseCommand
클래스를 임포트해주고 이를 상속받는 class Command
를 정의해줍니다. 커맨드 사용법을 문자열로 help
변수에 저장해주면 python manage.py help my_command
을 실행했을 때 해당 내용이 출력됩니다. 클래스 내의 handle()
메서드에 실행하고 싶은 동작을 일반 파이썬 함수로 작성해 주면 됩니다.
커맨드에 동작 옵션을 추가해줄 수 있습니다. 클래스 내에 add_arguments()
메서드를 정의해주면 됩니다. 이 메서드 내에서 parser.add_argument()
를 사용하여 위치 인자와 키워드 인자를 추가할 수 있습니다. 위치 인자는 명령어 실행 시 필수적으로 전달해야 하는 인자이며, 키워드 인자는 선택적으로 전달할 수 있는 인자입니다.
다음은 커스텀 manage.py
명령어의 예제 코드입니다. 이 코드는 인자로 전달된 엑셀 파일명을 사용하여 해당 파일을 읽어들인 후 데이터베이스에 입력하는 작업을 수행합니다.
import pandas as pd
from django.core.management.base import BaseCommand
from myapp.models import MyModel
class Command(BaseCommand):
help = 'Import data from an Excel file into the database'
def add_arguments(self, parser):
parser.add_argument('filename', type=str, help='The name of the Excel file to import')
def handle(self, *args, **kwargs):
filename = kwargs['filename']
# Read the data from the Excel file
data = pd.read_excel(filename)
# Iterate over the rows of the data and create new instances of MyModel
for index, row in data.iterrows():
MyModel.objects.create(
field1=row['field1'],
field2=row['field2'],
...
)
self.stdout.write(self.style.SUCCESS(f'Successfully imported data from {filename}'))
위의 코드에서 add_arguments() 메서드 내에서 parser.add_argument()를 사용하여 위치 인자 filename을 추가하고 있습니다. 이 인자는 명령어 실행 시 필수적으로 전달해야 하는 인자입니다.
handle() 메서드 내에서 kwargs 딕셔너리를 사용하여 전달된 파일명을 가져온 후 pandas 라이브러리의 read_excel() 함수를 사용하여 해당 파일을 읽어들입니다. 그런 다음 데이터의 각 행에 대해 반복하면서 MyModel의 새 인스턴스를 생성하고 데이터베이스에 저장합니다.
Django에서는 데이터베이스 입력을 위해 Model.objects.create() 메서드를 사용할 수 있습니다. 이 메서드는 모델의 새 인스턴스를 생성하고 데이터베이스에 저장하는 작업을 수행합니다.
'IT > 파이썬' 카테고리의 다른 글
Django - USE_TZ 설정에 따른 timezone.now() 리턴 (0) | 2023.05.18 |
---|---|
파이썬 슬라이스 join 을 이용해서 주소 문자열 만들기 (0) | 2023.05.09 |
파이썬 - 지도, 주소, 위도, 경도 등 지도 라이브러리 - GeoPy (0) | 2023.05.05 |
Python - UnicodeDecodeError: 'cp949' 에러 해결 방법 (0) | 2023.05.04 |
Django ORM - aggregation sum 결과가 0 인 결과 배제하기 (0) | 2023.05.04 |