[SQLAlchemy + MySQL] CURRENT_TIMESTAMP 설정

MySQL DB에 SQLAlchemy를 사용해 데이터를 넣을 때 타임스탬프를 자동으로 생성해 넣고 싶을 때가 있다.
필자의 경우에는 타임스탬프를 DB에서 처리해주었으면 하는 상황이었기에 DDL 단계에서부터 CURRENT_TIMESTAMP를 넣을 수 있는 지를 알아보았다.

Docs에 의하면 방법은 (server) default와 onupdate 파라미터이다.
(참고로 함수도 넣을 수 있다)

Table("mytable", metadata_obj,
    Column("somecolumn", Integer, default=12)
)

Table("mytable", metadata_obj,
    Column("somecolumn", Integer, onupdate=25)
)

default의 경우 default값을 어디서 생성하는지를 선택할 수 있다.
default를 사용할 경우 값이 클라이언트에서 생성되어 SQL로 변환돼 서버로 전달되며 (DML-default value)
server_default를 사용할 경우 서버단에서 default값을 생성한다 (DDL-default value).
참고로 onupdate도 클라이언트단에서의 onupdate와 서버단에서의 server_onupdate로 나뉜다.
다만 server_onupdate의 경우 서버에 update 신호만을 전달하도록 되어있어 별도의 트리거 작업이 요구된다. [Docs]

필자의 경우에는 서버단에서 타임스탬프가 생성되길 원하므로 server_default를 사용하였다.

from sqlalchemy.sql import func

Table("mytable", metadata_obj,
    Column("somecolumn", Integer, server_default=func.now())
)

그 밖에도 텍스트 형태로 default값을 설정하는 방법도 있다. [Docs]

from sqlalchemy import Table, MetaData, Column, Integer, String, TIMESTAMP
from sqlalchemy import text

metadata = MetaData()

mytable = Table(
    "mytable",
    metadata,
    Column('id', Integer, primary_key=True),
    Column('data', String(50)),
    Column(
        'last_updated',
        TIMESTAMP,
        server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    )
)

댓글 남기기