본문 바로가기
💻 개발블로그/django

Django심화강의:2주차(05)(20220216)

by August.J 2022. 2. 17.

🤓 Auto_now / Timezone 설정

 

📁 Auto_now, Auto_now_add

( Ctrl과 코드를 누르면 해당 코드 내부로 들어간다. )

 

- Auto_now : save할 때마다 생성시점을 기록한다.

- Auto_now_add : created 할 때마다 생성시간을 기록한다. 

 

데이터베이스탭에서 직접 수정하거나 rawsql 사용할 때 auto_now가 작동하지 않는다!


⏰ Timezone

- 데이터베이스에 들어가는 시간 확인하기 (파이참 하단의 python cosole을 클릭해서 연다.)

 

- 콘솔에 유저네임을 테스트로 저장할 때 auto_now가 실행되는지 테스트해본다.

from tabom.models.user import User

user = User(name='test')  #유저네임은 'test'로 한다.

user.save()  #유저정보 저장

 

- 데이터베이스에서 tabom_user를 눌러보면 정보가 들어와있음을 확인할 수 있다.

하지만 UTC시간으로 저장되어 있다. Timezone설정을 하지 않았기때문에!

- settings.py에서 USE_TZ = False로 변경한다.

- settings.py에서 TIME_ZONE = "Aisa/Seoul"로 변경한다.

- 데이터베이스 tabom_user에서 name=test값은 삭제한다. (행 삭제)

- 다시 유저정보를 넣고 Timezone이 잘 변경되었는지 확인한다.


📁 Auto_now 동작방식

 

- tabom app >> tests.py 파일삭제

- tabom app 안에 tests 파이썬패키지 생성

- tabom app >> tests >> test_auto_now.py 생성

- 테스트 할 코드작성

더보기
from django.test import TestCase

from tabom.models import User


class TestAutoNow(TestCase):
    def test_auto_now_field_is_set_when_save(self) -> None:
        user = User(name='test')
        user.save()
        self.assertIsNotNone(user.updated_at)
        self.assertIsNotNone(user.created_at)

- self.asserIsNotnone에 중단점 찍고 디버깅

created_at과 updated_at이 현재시간으로 잘 들어왔음을 확인할 수 있다.

>> 여기서 찍힌 데이터는 django가 만든 테스트 데이터베이스로 들어가므로 실제 데이터베이스에서는 확인할 수 없다.

 

self.asserIsNotnone에서 디버깅 실행 중 1007에러 발생

Got an error creating the test database: (1007, "Can't create database 'test_sparta'; database exists")
Type 'yes' if you would like to try deleting the test database 'test_sparta', or 'no' to cancel:

 

동일한 이름의 데이터베이스가 존재한다는 이야기 같다. 테스트 데이터베이스를 삭제하겠다는 'yes'를 입력한 후 해결.

 

- 테스트실행 !!

빨간색으로 표시된 아이콘을 눌러 테스트를 실행, 성공하면 초록색 통과

 

- 만약 콘솔에서 row를 직접 입력하면 auto_now가 작동하지 않는다!

- raw sql을 실행해도 auto_now가 작동하지 않는다. ( test_auto_now안에 코드 추가 후 테스트 실행 )

더보기
def test_auto_now_field_not_set_when_raw_sql_update_executed(self) -> None:
    # Given
    from django.db import connection
    with connection.cursor() as cursor:
        cursor.execute(
            "INSERT INTO tabom_user(id, name, updated_at, created_at) "
            "VALUES (1, 'hihi', '1999-01-01 10:10:10', '1999-01-01 10:10:10')"
        )

        # When
        from time import sleep
        sleep(1)   # update after 1sec
        cursor.execute(
            "UPDATE tabom_user SET name='changed' WHERE id=1"
        )

    # Then
    user = User.objects.filter(id=1).get()
    from datetime import datetime
    self.assertEqual(user.updated_at, datetime(year=1999, month=1, day=1, hour=10, minute=10, second=10))