SQLAlchemy UTC Datetime Type

0.14.0 · active · verified Thu Apr 16

SQLAlchemy-UTC provides a `UtcDateTime` type for SQLAlchemy that reliably stores and retrieves timezone-aware `datetime` objects in UTC. It acts as a robust replacement for SQLAlchemy's built-in `DateTime(timezone=True)`, particularly for databases like SQLite and MySQL that lack native `timestamptz` support by converting values to and from UTC. The library also includes a `utcnow()` helper function for server-side default generation. The current version is 0.14.0, released in September 2021.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates defining a SQLAlchemy model with `UtcDateTime` columns, using `utcnow()` for default and on-update values. It then creates, retrieves, and updates an event, verifying that the `datetime` objects returned are always timezone-aware and in UTC.

import datetime
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy_utc import UtcDateTime, utcnow

# Setup database (using SQLite for simplicity)
engine = create_engine('sqlite:///./test.db')
Base = declarative_base()

class Event(Base):
    __tablename__ = 'events'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    created_at = Column(UtcDateTime, default=utcnow)
    updated_at = Column(UtcDateTime, default=utcnow, onupdate=utcnow)

    def __repr__(self):
        return f"<Event(id={self.id}, name='{self.name}', created_at={self.created_at}, updated_at={self.updated_at})>"

# Create tables
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

# Create a new event
new_event = Event(name='Meeting Start')
session.add(new_event)
session.commit()
print(f"Created event: {new_event}")

# Retrieve and verify timezone
retrieved_event = session.query(Event).filter_by(name='Meeting Start').first()
print(f"Retrieved event: {retrieved_event}")
assert retrieved_event.created_at.tzinfo == datetime.timezone.utc
print("Created_at is UTC aware.")

# Update an event
retrieved_event.name = 'Meeting Concluded'
session.add(retrieved_event)
session.commit()
print(f"Updated event: {retrieved_event}")
assert retrieved_event.updated_at.tzinfo == datetime.timezone.utc
print("Updated_at is UTC aware.")

session.close()

view raw JSON →