Auto updating columns don't work with SQLModel docs on updates #782
-
        First Check
 Commit to Help
 Example Codefrom sqlmodel import SQLModel, Field, Session, create_engine
import datetime
engine = create_engine(...)
class SimpleTable(SQLModel, table=True):
    version: int = Field(primary_key=True)
    updated_at: datetime.datetime = Field(default_factory=datetime.datetime.utcnow, nullable=False)
def update_version() -> None:
    """Update the version of the table, where updated_at should update automatically"""
    with Session(engine) as session:
	stmt = select(SimpleTable)
	tbl = session.exec(stmt).one()
	tbl.version += 1
	session.add(tbl)
	session.commit()DescriptionWith the code above, which 
 The  Operating SystemmacOS Operating System DetailsNo response SQLModel Version0.0.14 Python VersionPython 3.9.8 Additional ContextNo response  | 
  
Beta Was this translation helpful? Give feedback.
Replies: 3 comments
-
| 
         I don't know the answer here at all, but I am wondering if 
 would work? I'm just starting to use SQLModel and also trying to figure out where/how to best specify these things.  | 
  
Beta Was this translation helpful? Give feedback.
-
| 
         I think the following works and is a pretty clean solution?  | 
  
Beta Was this translation helpful? Give feedback.
-
| 
         The following works:     updated_at: datetime = Field(
        sa_column_kwargs={
            "server_default": func.now(),
            "onupdate": func.now(),
        },
        nullable=False,
    )Runnable code example in the details: import time
from datetime import datetime
from sqlmodel import Field, Session, SQLModel, create_engine, func
class SimpleTable(SQLModel, table=True):
    version: int = Field(primary_key=True)
    updated_at: datetime = Field(
        sa_column_kwargs={
            "server_default": func.now(),
            "onupdate": func.now(),
        },
        nullable=False,
    )
def main() -> None:
    engine = create_engine(
        "postgresql://user:mysecretpassword@localhost/some_db", echo=True
    )
    SQLModel.metadata.drop_all(engine)
    SQLModel.metadata.create_all(engine)
    with Session(engine) as session:
        session.add(SimpleTable(version=1))
        session.commit()
    with Session(engine) as session:
        o1 = session.get(SimpleTable, 1)
        updated_at = o1.updated_at
        time.sleep(0.1)
        o1.version = 2
        session.commit()
        session.refresh(o1)
        assert o1.updated_at > updated_at, "updated_at should be updated on commit"
if __name__ == "__main__":
    main() | 
  
Beta Was this translation helpful? Give feedback.
The following works:
Runnable code example in the details: