Berechnen Sie Zeitstempel in Ihrer Datenbank, nicht in Ihrem Client
Aus Gründen der Vernunft möchten Sie wahrscheinlich, dass alle datetimes
Daten von Ihrem DB-Server und nicht vom Anwendungsserver berechnet werden. Das Berechnen des Zeitstempels in der Anwendung kann zu Problemen führen, da die Netzwerklatenz variabel ist, Clients eine geringfügig unterschiedliche Taktdrift aufweisen und verschiedene Programmiersprachen gelegentlich die Zeit geringfügig unterschiedlich berechnen.
Mit SQLAlchemy können Sie dies tun, indem Sie func.now()
oder func.current_timestamp()
(sie sind Aliase voneinander) übergeben, wodurch die DB angewiesen wird, den Zeitstempel selbst zu berechnen.
Verwenden Sie SQLALchemy's server_default
Darüber hinaus ist es für einen Standard, bei dem Sie der Datenbank bereits anweisen, den Wert zu berechnen, im Allgemeinen besser, ihn server_default
anstelle von zu verwenden default
. Dies weist SQLAlchemy an, den Standardwert als Teil der CREATE TABLE
Anweisung zu übergeben.
Wenn Sie beispielsweise ein Ad-hoc-Skript für diese Tabelle schreiben, server_default
bedeutet dies, dass Sie sich nicht um das manuelle Hinzufügen eines Zeitstempelaufrufs zu Ihrem Skript kümmern müssen. Die Datenbank legt dies automatisch fest.
SQLAlchemy verstehen onupdate
/server_onupdate
SQLAlchemy unterstützt auch onupdate
, dass bei jeder Aktualisierung der Zeile ein neuer Zeitstempel eingefügt wird. Auch hier ist es am besten, die DB anzuweisen, den Zeitstempel selbst zu berechnen:
from sqlalchemy.sql import func
time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())
Es gibt einen server_onupdate
Parameter, der jedoch im Gegensatz server_default
dazu nichts Serverseitiges festlegt. Es teilt SQLalchemy lediglich mit, dass Ihre Datenbank die Spalte ändert, wenn eine Aktualisierung erfolgt (möglicherweise haben Sie einen Auslöser für die Spalte erstellt ), sodass SQLAlchemy nach dem Rückgabewert fragt, damit das entsprechende Objekt aktualisiert werden kann.
Ein weiteres mögliches Problem:
Es könnte Sie überraschen, dass alle Änderungen innerhalb einer einzelnen Transaktion denselben Zeitstempel haben. Dies liegt daran, dass der SQL-Standard angibt, dass CURRENT_TIMESTAMP
Werte basierend auf dem Start der Transaktion zurückgegeben werden.
PostgreSQL bietet den Nicht-SQL-Standard statement_timestamp()
und clock_timestamp()
das tut Änderung innerhalb einer Transaktion. Dokumente hier: https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
UTC-Zeitstempel
Wenn Sie UTC-Zeitstempel verwenden möchten, finden Sie func.utcnow()
in der SQLAlchemy-Dokumentation einen Implementierungsstub für . Sie müssen jedoch selbst geeignete treiberspezifische Funktionen bereitstellen.