Обновление меток времени с помощью SQLAlchemy и FastAPI: подробное руководство

В современных веб-приложениях принято отслеживать временные метки создания и изменения записей базы данных. SQLAlchemy и FastAPI — это мощные инструменты, которые можно использовать вместе для создания надежных и эффективных серверных систем. В этой статье мы рассмотрим несколько методов обновления меток времени с помощью SQLAlchemy и FastAPI, а также примеры кода для каждого метода.

Метод 1: использование параметра column_defaultSQLAlchemy

Один простой подход — определить значения по умолчанию для столбцов меток времени с помощью параметра column_defaultSQLAlchemy. Это позволяет базе данных автоматически обновлять метку времени при каждом обновлении записи. Вот пример:

from sqlalchemy import Column, DateTime, func
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime, default=func.current_timestamp())
    updated_at = Column(DateTime, default=func.current_timestamp(), onupdate=func.current_timestamp())

В этом примере в столбце created_atбудет автоматически установлена ​​текущая временная метка при вставке новой записи, а в столбце updated_atтакже будет обновлена ​​текущая отметка времени. временная метка при каждом изменении существующей записи.

Метод 2: использование событий SQLAlchemy

Другой подход — использовать события SQLAlchemy для обновления меток времени. Прослушивая событие before_update, мы можем установить в столбце updated_atтекущую временную метку. Вот пример:

from sqlalchemy import Column, DateTime, event
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
Base = declarative_base()
class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime, default=datetime.utcnow)
    updated_at = Column(DateTime)
@event.listens_for(MyTable, 'before_update')
def update_timestamp(mapper, connection, target):
    target.updated_at = datetime.utcnow()

В этом примере в столбце created_atуказывается текущая временная метка UTC при вставке новой записи. Столбец updated_atизначально остается пустым и будет автоматически обновляться до текущей отметки времени в формате UTC при каждом изменении существующей записи.

Метод 3: использование перехватчиков запросов preи postFastAPI

FastAPI предоставляет перехватчики запросов, которые позволяют нам выполнять код до и после каждого запроса. Мы можем использовать эти перехватчики для обновления меток времени. Вот пример:

from fastapi import FastAPI
from sqlalchemy import Column, DateTime, func
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
Base = declarative_base()
class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime)
    updated_at = Column(DateTime)
app = FastAPI()
@app.middleware("http")
async def update_timestamps(request, call_next):
    if request.method == "POST":
        record = MyTable(created_at=datetime.utcnow(), updated_at=datetime.utcnow())
        # Save the record to the database
    elif request.method == "PUT":
        record = MyTable(updated_at=datetime.utcnow())
        # Update the record in the database
    response = await call_next(request)
    return response

В этом примере мы определяем промежуточное программное обеспечение FastAPI, которое обновляет временные метки на основе метода HTTP-запроса. При выполнении запроса POSTсоздается новая запись, в которой для created_atи updated_atустановлена ​​текущая временная метка UTC. При отправке запроса PUTобновляется только временная метка updated_at.

В этой статье мы рассмотрели три различных метода обновления меток времени с использованием SQLAlchemy и FastAPI. Каждый метод предлагает свои преимущества и может использоваться в зависимости от требований вашего приложения. Используя возможности этих инструментов, вы можете легко обновлять временные метки и обеспечивать точное отслеживание изменений записей в своих серверных системах.

Не забудьте выбрать метод, который лучше всего соответствует вашим потребностям и делает процесс разработки эффективным и удобным в сопровождении.