sqlmigrate
- makemigartions 를 하면 DB에 실행 되기전의 파일이 생성된다.
- sqlmigrate는 마이그레이션이 실제로 어떤 SQL을 실행할지 미리 확인하는 명령어 이다.
- 데이터베이스에 변경을 적용하지 않고, SQL만 출력한다.
python manage.py sqlmigrate <앱이름> <마이그레이션 번호>
# shettings.py
LANGUAGE_CODE = "en-us"
TIME_ZONE = "Asia/Seoul"
USE_I18N = True
USE_TZ = False
poetry add django-ninja
- DRF 보다 가볍고 FastAPI 스타일을 지원하는 장고 라이브러리 스웨거 문서지원
from ninja import NinjaAPI
api = NinjaAPI()
@api.get("like")
def api_do_like(request: HttpRequest, user_id: int, article_id: int) -> None:
do_like(user_id, article_id)
return None
swagger-ui 를 사용해 데이터를 넣어 본다 그리고 http url를 찾는다
ctx.captured_queries
: Django의 테스트 환경에서 실행된 데이터베이스 쿼리를 캡처할 때 사용하는 속성
from django.test.utils import CaptureQueriesContext
from django.db import connection
from myapp.models import User
with CaptureQueriesContext(connection) as ctx:
User.objects.filter(is_active=True).count() # 실행할 쿼리
# 실행된 쿼리 확인
for query in ctx.captured_queries:
print(query["sql"]) # 실행된 SQL 출력
- curl 대신 http를 사용할수 있게 해주는 패키지
brew install httpie
http ":8000/api/like?user_id=2&article_id=2" &
http ":8000/api/like?user_id=2&article_id=2" &
http ":8000/api/like?user_id=2&article_id=2" &
http ":8000/api/like?user_id=2&article_id=2" &
http ":8000/api/like?user_id=2&article_id=2" &
이 코드를 터미널에 실행시키면 DB에서 한개가 아닌 여러개의 데이터가 들어간 것을 확인할 수 있다.
UniqueConstarnt
class Like(BaseModel):
user = models.ForeignKey(User, on_delete=models.CASCADE)
article = models.ForeignKey(Article, on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(fields=["user","article"], name="UIX_user_id_article_id")
]
이후 migrate 를 진행한 후 다시한번 넣어보면 하나의 컬럼만 형성된 것을 확인할 수 있다.
테스트 코드에서 중단점을 찍어 디버그를 할수 있다. 디버그시 변수명, 타입명 등을 바로 찾을수 있고 어떤 에러가 발생했는지 확인할 수도 있다. Exception 으로 처리해놓은 에러 확인가능.
✅ 함수의 시작 부분 → 입력 값이 올바른지 확인
✅ 조건문 내부 (If-Else) → 어떤 분기로 가는지 확인
✅ 반복문 내부 (For / While) → 루프가 정상적으로 도는지 확인
✅ 예외가 발생할 가능성이 있는 부분 → 오류 원인 분석
✅ 변수 값이 변경되는 부분 → 데이터 흐름 추적
PyCharm의 Evaluate Expression (표현식 평가) 기능은 디버깅 중 특정 변수의 값을 확인하거나 표현식을 실행할 때 사용하는 도구입니다.
📌 주요 기능
✅ 디버깅 중 특정 변수 값 확인
✅ 특정 코드나 표현식을 실행하여 결과 확인
✅ 새로운 값으로 변수 변경 가능
웹 서버와(HTTP요청 처리)와 애플리케이션 실행 환경을 제공하는 서버
사용자의 요청을 처리하고 DB와 연동하며 동적인 응답을 생성
웹서버는 정적 콘텐츠 제공, WAS는 동적인 로직 처리를 담당.
WAS는 웹 애플리케이션이 실행되는 핵심 서버로, 클라이언트의 요청을 받아서 비즈니스 로직을 실행하고 응답을 생성하는 역할을 합니다. 웹 서버와 함께 사용되며, 다양한 기술과 연계하여 확장성과 보안성을 높일 수 있음
Author.objects.using("default") # default 로 정의해 놓은 DB를 사용
Author.objects.using("read") # 읽기 전용으로 지정해 놓은 DB사용
- 테스트가 코드의 몇 퍼센트를 실행했는지 측정하는 지표
poetry run coverage run manage.py test
테스트 실행 및 커버리지 측정poetry run coverage report -m
커버리지 리포트 출력
coverage 는 전체코드 분의 제품 테스트 코드 이다. 그래서 모든 함수에 대해 테스트코드를 작성해야한다.
[tool.coverage.report]
fail_under = 80 # 몇프로를 기준으로 coverage가 됬는지 하는 것
[tool.coverage.run]
omit = [ # coverage 측정을 할 필요가 없는 것들
".mypy_cache/**/*", # mypy가 내부적으로 하는 커버리지
"*/migrations/*", # 장고에서 만든건데 할 필요가 없음
"*/*test*.py", # 테스트 코드 할필요 없음
# 앱의 실제 코드가 테스트에 의해 얼마나 실행되었는지 측정하는 것인데
# 테스트를 수행하는 코드이기에 측정할 필요가 없음
]
ci 파일에 이걸 넣는다
- name: Test python project
run: |
poetry run coverage run manage.py test
poetry run coverage report -m
echo $?
바로 직전의 코드를 출력하는 명령어인데 eixt code
가 출력된다 리눅스에서 exit 코드는 0을 제외한 다른 숫자는 전부 오류가 발생했단 것이다select related : join
prefetch related : 개별 쿼리가 생성
가장큰 특징 : 트랜잭션
서버가 다운되면 앞에 내용이 처리되는 것을 방지하기위해 전부 실패되거나 전부 성공을 처리한다 이것이
Atomicity 이다.
기본 구조는 모든것을 실행 후 commit or Rollback 을 하는 것이다.
기본 구조는 원래 BEGIN; 을 시작한후 모든 처리동작을 한후 COMMIT 을 하는것이다 or Rollback
쉽게말해 다른 브랜치로 이동하여 작업하는 것이다 그래서 다른곳에서의 일이 영향을 받지 않는다.