Calcular carimbos de data e hora no seu banco de dados, não no seu cliente
Por questões de sanidade, você provavelmente deseja ter todos datetimes
calculados pelo seu servidor de banco de dados, e não pelo servidor de aplicativos. O cálculo do registro de data e hora no aplicativo pode causar problemas, porque a latência da rede é variável, os clientes experimentam um desvio do relógio ligeiramente diferente e diferentes linguagens de programação ocasionalmente calculam o tempo de maneira ligeiramente diferente.
SQLAlchemy permite que você faça isso passando func.now()
ou func.current_timestamp()
(eles são aliases um do outro) que informa ao banco de dados para calcular o próprio carimbo de data / hora.
Use SQLALchemy server_default
Além disso, para um padrão em que você já está dizendo ao banco de dados para calcular o valor, geralmente é melhor usá-lo em server_default
vez de default
. Isso informa ao SQLAlchemy para passar o valor padrão como parte da CREATE TABLE
instrução.
Por exemplo, se você escrever um script ad hoc nessa tabela, usar server_default
significa que não precisará se preocupar em adicionar manualmente uma chamada de carimbo de data / hora ao seu script - o banco de dados o definirá automaticamente.
Noções básicas sobre SQLAlchemy onupdate
/server_onupdate
O SQLAlchemy também suporta, onupdate
para que, sempre que a linha for atualizada, ele insira um novo carimbo de data / hora. Novamente, é melhor dizer ao banco de dados para calcular o próprio carimbo de data / hora:
from sqlalchemy.sql import func
time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())
Existe um server_onupdate
parâmetro, mas, ao contrário server_default
, ele não define nada no servidor. Apenas informa ao SQLalchemy que seu banco de dados alterará a coluna quando uma atualização acontecer (talvez você tenha criado um gatilho na coluna ); portanto, o SQLAlchemy solicitará o valor de retorno para que ele possa atualizar o objeto correspondente.
Uma outra pegada em potencial:
Você pode se surpreender ao perceber que, se você fizer várias alterações em uma única transação, todas elas terão o mesmo carimbo de data / hora. Isso ocorre porque o padrão SQL especifica que CURRENT_TIMESTAMP
retorna valores com base no início da transação.
PostgreSQL fornece o não-SQL-padrão statement_timestamp()
e clock_timestamp()
que fazer a mudança dentro de uma transação. Documentos aqui: https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
Registro de data e hora UTC
Se você deseja usar registros de data e hora UTC, func.utcnow()
é fornecido um stub de implementação na documentação do SQLAlchemy . Você precisa fornecer as funções específicas do driver apropriadas por conta própria.