В современных веб-приложениях принято отслеживать временные метки создания и изменения записей базы данных. SQLAlchemy и FastAPI — это мощные инструменты, которые можно использовать вместе для создания надежных и эффективных серверных систем. В этой статье мы рассмотрим несколько методов обновления меток времени с помощью SQLAlchemy и FastAPI, а также примеры кода для каждого метода.
Метод 1: использование параметра column_default
SQLAlchemy
Один простой подход — определить значения по умолчанию для столбцов меток времени с помощью параметра column_default
SQLAlchemy. Это позволяет базе данных автоматически обновлять метку времени при каждом обновлении записи. Вот пример:
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
и post
FastAPI
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. Каждый метод предлагает свои преимущества и может использоваться в зависимости от требований вашего приложения. Используя возможности этих инструментов, вы можете легко обновлять временные метки и обеспечивать точное отслеживание изменений записей в своих серверных системах.
Не забудьте выбрать метод, который лучше всего соответствует вашим потребностям и делает процесс разработки эффективным и удобным в сопровождении.