[django]쿼리셋 업데이트하기

쿼리셋을 업데이트 하는 방법으로 크게 두 가지가 있을 것 같다. admin이라는 유저가 작성한 게시물의 쿼리셋를 구하고 특정 필드의 값을 업데이트하는 방법에 대해서 정리한다.

1. 반복문을 통해 업데이트

일단 admin유저가 작성한 게시물 쿼리셋을 다음과 같이 구한다.

1
post_list = Post.objects.filter(author='admin')

딱히 의미는 없지만 만약 success라는 BooleanField가 있다고 가정하고 이 필드의 값을 True로 모두 변경한다고 할때, 반복문을 통해 작업을 수행할 수 있다.

1
2
3
for post in post_list:
post.success = True
post.save()

가장 떠올리기 쉬운 방법이라고 생각하는데 몇 가지 단점들이 존재한다.

  • 여러번의 save 함수를 호출 => 만약 post_save와 같은 시그널이 존재한다면 여러번 호출되게 됨
  • DB의 과부화(반복하는 만큼 쿼리문 생성)
  • 느리다

2. 쿼리셋의 update 함수 사용

update 함수를 사용하면 단 하나의 쿼리문을 생성하여 빠르고 효율적으로 작업할 수 있다.

1
2
post_list = Post.objects.filter(author='admin')
post_list.update(success=True)

결과

만약 쿼리셋으로부터 특정 필드의 값들을 한 번에 업데이트해야 한다면 반복문을 사용하지 않고 update 함수를 이용하는 것이 좋다. 단 하나만의 쿼리문을 생성하며 save 함수를 호출하지 않는 다는 것에 유의하자.


[참고]
https://m.blog.naver.com/PostView.nhn?blogId=jung_kj&logNo=221002011537&proxyReferer=https%3A%2F%2Fwww.google.com%2F
http://recordingbetter.com/django/2017/06/07/Django-ORM
https://tech.peoplefund.co.kr/2017/11/03/django-db-optimization.html

Share

[Django]쉘 스크립트에서 collectstatic 실행시 yes 입력하기

새로운 코드를 받아오고 반영하기 위한 일련의 과정들을 자동 배포를 위한 쉘 스크립트에서 관리하고 있다. 하지만 Django의 collectstatic 명령어는 사용자로부터 yes / no 입력을 받아야지 작업을 마무리 하는데 쉘 스크립트에서는 사용자가 입력을 할 수 없어 에러가 발생하는 경우가 종종 생긴다.

사용자의 인터렉션 없이 yes를 입력하기 위해 다음과 같이 입력한다.

리눅스 파이프라인 이용

리눅스의 파이프라인을 통해 손쉽게 해결할 수 있다.

1
2
3
4
5
# yes
echo yes | python manage.py collectstatic

# no
echo no | python manage.py collectstatic

–no-input 옵션

사실 input을 받지 않도록 하는 방법도 있는데 collectstatic과 같이 기본값이 없는 경우에는 사용할 수 없다는 단점이 존재한다.

1
python manage.py collectstatic --no-input

[참고]
https://stackoverflow.com/questions/8705305/automated-django-receive-hook-on-server-respond-to-collectstatic-with-yes

Share

[CodeDeploy]EC2 우분투 인스턴스에 CodeDeploy Agent 설치하기

배포할 서버에 접속하여 최초 한 번만 설치해주면 된다.

1. apt 저장소 업데이트

1
sudo apt-get update

2. ruby 설치

CodeDeploy Agent는 ruby라는 프로그래밍 언어로 작성되어있다. 따라서 ruby를 설치해주어야 한다.

1
2
3
4
5
# ubuntu 16.04
sudo apt-get install ruby

# ubuntu 14.04
sudo apt-get install ruby2.0

3. wget 설치

1
sudo apt-get install wget

4. Agent 설치

wget으로 Agent의 설치파일을 다운받는 과정에 bucket-name과 region-identifier를 적절히 적어주어야 한다. 여기를 참고해서 원하를 region으로 설정하면 된다.

한국 리전을 사용하려면
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
로 설치하면 된다.

1
2
3
4
5
6
7
8
9
10
11
# install 파일 경로는 원하는 대로 가능
cd /home/ubuntu

# bucket-name과 region-identifier를 각자의 상황에 맞게 변경
# wget https://<bucket-name>.s3.<region-identifier>.amazonaws.com/latest/install

# Seoul region
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

chmod +x ./install
sudo ./install auto

현재까지 에러가 발생하지 않았다면 문제 없이 Agent 설치에 성공한 것이다. 아래의 명령어는 Agent의 상태확인과 서비스를 실행시켜준다.

1
2
3
4
5
# codedeploy-agent 상태 확인
sudo service codedeploy-agent status

# codedeploy-agent 서비스 시작
sudo service codedeploy-agent start

[참고]
https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html
https://docs.aws.amazon.com/codedeploy/latest/userguide/resource-kit.html#resource-kit-bucket-names

Share