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") ) )