클라이언트가 아닌 DB 내 타임 스탬프 계산
건강을 위해 아마도 datetimes
응용 프로그램 서버가 아닌 DB 서버에서 모두 계산 해야 할 것입니다 . 응용 프로그램에서 타임 스탬프를 계산하면 네트워크 대기 시간이 가변적이고 클라이언트가 약간 다른 클럭 드리프트를 경험하며 프로그래밍 언어에 따라 시간이 약간 다르게 계산되므로 문제가 발생할 수 있습니다.
SQLAlchemy를 사용하면 타임 스탬프 자체를 계산하도록 DB에 지시 하는 func.now()
또는 func.current_timestamp()
서로 별칭을 전달하여이 작업을 수행 할 수 있습니다 .
SQLALchemy 사용 server_default
또한 DB에 이미 값을 계산하도록 지시하는 기본값의 경우 일반적으로 server_default
대신 대신 사용하는 것이 좋습니다 default
. 이것은 SQLAlchemy에게 CREATE TABLE
명령문의 일부로 기본값을 전달하도록 지시 합니다.
예를 들어이 표에 대해 임시 스크립트를 작성하는 경우을 사용하면 스크립트에 server_default
타임 스탬프 호출을 수동으로 추가하는 것에 대해 걱정할 필요가 없습니다. 데이터베이스가 자동으로 설정합니다.
SQLAlchemy의 이해 onupdate
/server_onupdate
또한 SQLAlchemy는 onupdate
행이 업데이트 될 때마다 새로운 타임 스탬프를 삽입 할 수 있도록 지원합니다 . 다시 한 번, 타임 스탬프 자체를 계산하도록 DB에 알리는 것이 가장 좋습니다.
from sqlalchemy.sql import func
time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())
거기에있다 server_onupdate
매개 변수는하지만, 달리 server_default
, 실제로는 아무것도 서버 쪽을 설정하지 않습니다. 업데이트가 발생할 때 (아마도 열 에서 트리거 를 만들었을 때) 데이터베이스가 열을 변경한다고 SQLalchemy에 알려주 므로 SQLAlchemy는 반환 값을 요청하여 해당 개체를 업데이트 할 수 있습니다.
또 다른 잠재력은 다음과 같습니다.
단일 트랜잭션 내에서 많은 변경을 수행하면 모두 동일한 타임 스탬프를가집니다. SQL 표준 CURRENT_TIMESTAMP
은 트랜잭션 시작에 따라 값 을 반환하도록 지정하기 때문 입니다.
PostgreSQL은 비 SQL 표준 제공 statement_timestamp()
하고 clock_timestamp()
있는 할 트랜잭션 내에서 변화를. 여기 문서 : https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
UTC 타임 스탬프
UTC 타임 스탬프를 사용하려면 SQLAlchemy documentation 에 구현 스텁 func.utcnow()
이 제공됩니다 . 그래도 적절한 드라이버 별 기능을 제공해야합니다.