🤓 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))
'💻 개발블로그 > django' 카테고리의 다른 글
.DS_store 파일제거 (0) | 2022.05.11 |
---|---|
Django 포트 사용 에러 (0) | 2022.05.10 |
Django심화강의:2주차(04)(20220216) (0) | 2022.02.16 |
Django심화강의:2주차(03)(20220215) (0) | 2022.02.16 |
Django심화강의:2주차(02)(20220215) (0) | 2022.02.15 |