[python/sqlalchemy] utc datetime 필드 목록을 ISO 8601 date format 으로 select 후, 다시 그 값을 where 조건에 사용하는 쿼리 샘플

By | 3월 10, 2022
TEST_TABLE = sqlalchemy.Table(
    "TEST_TABLE",
    metadata,
    sqlalchemy.Column("user_id", sqlalchemy.Integer),
    sqlalchemy.Column("del_yn", sqlalchemy.String),
    sqlalchemy.Column("update_time", sqlalchemy.DateTime)
)

# MAX_HISTORY 관리를 위한 delete 작업
MAX_HISTORY = 10 # 레코드를 이 개수만 유지 (FIFO)
where_clause = f"""user_id={user_id} AND del_yn <> 'Y'"""
query = f"""
    /* 수정일시 - ISO 8601 format (명시적 datetime 객체 바인딩이 아니라 sqlalchemy.engine.row.Row 로 자동 바인딩 되므로 쿼리단에서 포맷팅 수행) */
    select date_format(update_time, '%Y-%m-%dT%TZ') as dt 
    from TEST_TABLE
    where {where_clause}
    order by update_time desc
"""
list = await db.fetch_all(query) ## 목록 조회
if list and len(list) > MAX_HISTORY:
    max_one = list[MAX_HISTORY - 1] # sqlalchemy.engine.row.Row 타입
    max_dt = dict(max_one)['dt']; # dict 로 변환 후 값 획득
    where_clause = where_clause + f" AND update_time < '{max_dt}'"
    query = TEST_TABLE.update().values(update_time=datetime.utcnow(), del_yn="Y").where(text(where_clause))
    his_deleted = await db.execute(query)   # delete
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments