SQLAlchemy 기본 DateTime
이것은 나의 선언적 모델입니다.
import datetime
from sqlalchemy import Column, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Test(Base):
__tablename__ = 'test'
id = Column(Integer, primary_key=True)
created_date = DateTime(default=datetime.datetime.utcnow)
그러나이 모듈을 가져 오려고하면 다음 오류가 발생합니다.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "orm/models2.py", line 37, in <module>
class Test(Base):
File "orm/models2.py", line 41, in Test
created_date = sqlalchemy.DateTime(default=datetime.datetime.utcnow)
TypeError: __init__() got an unexpected keyword argument 'default'
정수 유형을 사용하면 기본값을 설정할 수 있습니다. 무슨 일이야?
DateTime
기본 키가 입력으로 없습니다. 기본 키는 Column
기능에 대한 입력이어야합니다 . 이 시도:
import datetime
from sqlalchemy import Column, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Test(Base):
__tablename__ = 'test'
id = Column(Integer, primary_key=True)
created_date = Column(DateTime, default=datetime.datetime.utcnow)
클라이언트가 아닌 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 provides the non-SQL-standard statement_timestamp()
and clock_timestamp()
which do change within a transaction. Docs here: https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
UTC timestamp
If you want to use UTC timestamps, a stub of implementation for func.utcnow()
is provided in SQLAlchemy documentation. You need to provide appropriate driver-specific functions on your own though.
You can also use sqlalchemy builtin function for default DateTime
from sqlalchemy.sql import func
DT = Column(DateTime(timezone=True), default=func.now())
The default
keyword parameter should be given to the Column object.
Example:
Column(u'timestamp', TIMESTAMP(timezone=True), primary_key=False, nullable=False, default=time_now),
The default value can be a callable, which here I defined like the following.
from pytz import timezone
from datetime import datetime
UTC = timezone('UTC')
def time_now():
return datetime.now(UTC)
You likely want to use onupdate=datetime.now
so that UPDATEs also change the last_updated
field.
SQLAlchemy has two defaults for python executed functions.
default
sets the value on INSERT, only onceonupdate
sets the value to the callable result on UPDATE as well.
As per PostgreSQL documentation, https://www.postgresql.org/docs/9.6/static/functions-datetime.html
now, CURRENT_TIMESTAMP, LOCALTIMESTAMP return the time of transaction.
This is considered a feature: the intent is to allow a single transaction to have a consistent notion of the "current" time, so that multiple modifications within the same transaction bear the same time stamp.
You might want to use statement_timestamp or clock_timestamp if you don't want transaction timestamp.
statement_timestamp()
returns the start time of the current statement (more specifically, the time of receipt of the latest command message from the client). statement_timestamp
clock_timestamp()
returns the actual current time, and therefore its value changes even within a single SQL command.
참고URL : https://stackoverflow.com/questions/13370317/sqlalchemy-default-datetime
'programing tip' 카테고리의 다른 글
EditText의 포커스를 처리하는 이벤트 (0) | 2020.06.30 |
---|---|
변수가 범위 내에 있는지 확인? (0) | 2020.06.30 |
Android : android.content.res.Resources $ NotFoundException : 문자열 리소스 ID # 0x5 (0) | 2020.06.30 |
jQuery를 사용하여 자식 요소를 부모에서 다른 부모 요소로 옮기는 방법 (0) | 2020.06.30 |
NSInteger를 NSString 데이터 유형으로 어떻게 변환합니까? (0) | 2020.06.30 |