sqlalchemy實現時間列自動更新

水痕001發表於2019-01-03

一、使用場景需求

  • 1、在實際專案開發過程中,使用者可以操作的資料,我們往往會新增一個欄位,來儲存使用者最後一次修改時間
  • 2、一些系統中,我們需要儲存使用者最後一次登入時間,來統計使用者的活躍度

二、 在sqlalchemy中常規的做法

  • 1、資料模型

    import datetimefrom uuid import uuid4from sqlalchemy import Column, Integer, String, DateTime, Booleanfrom sqlalchemy_demo.connect import Baseclass UserModule(Base):    """    建立一個使用者的資料模型    """    __tablename__ = 'user'    uuid = Column(String(36), unique=True, nullable=False, default=lambda: str(uuid4()), comment='uuid')    id = Column(Integer, primary_key=True, autoincrement=True, comment='使用者id')    user_name = Column(String(30), nullable=False, unique=True, comment='使用者名稱')    password = Column(String(64), nullable=False, comment='使用者密碼')    createtime = Column(DateTime, default=datetime.datetime.now, comment='建立時間')    updatetime = Column(DateTime, default=datetime.datetime.now, comment='修改時間')    is_lock = Column(Boolean, default=False, nullable=False, comment='是否鎖住使用者')複製程式碼
  • 2、每次更新資料的時候,需要手動插入時間欄位,來確保updatetime這個時間欄位才會更新

三、使用自動更新資料

基於上面手動插入時間欄位,在開發過程中很不方便,我們需要的是類似django中修改資料,該列會自動更新

  • 1、導包

    from uuid import uuid4from sqlalchemy import Column, Integer, String, DateTime, Boolean, TIMESTAMP, funcfrom sqlalchemy.orm import relationshipfrom sqlalchemy_demo.connect import Base複製程式碼
  • 2、定義資料模型

    class UserModule(Base):    """    建立一個使用者的資料模型    """    __tablename__ = 'user'    uuid = Column(String(36), unique=True, nullable=False, default=lambda: str(uuid4()), comment='uuid')    id = Column(Integer, primary_key=True, autoincrement=True, comment='使用者id')    user_name = Column(String(30), nullable=False, unique=True, comment='使用者名稱')    password = Column(String(64), nullable=False, comment='使用者密碼')    createtime = Column(DateTime, server_default=func.now(), comment='建立時間')    # onupdate設定自動更改    updatetime = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment='修改時間')    is_lock = Column(Boolean, default=False, nullable=False, comment='是否鎖住使用者')複製程式碼
  • 3、接下來的建立表與增刪改查都一樣的

來源:https://juejin.im/post/5c2dbd92e51d450d970729e8

相關文章