Hitung cap waktu dalam DB Anda, bukan klien Anda
Untuk kewarasan, Anda mungkin ingin semua datetimes
dihitung oleh server DB Anda, bukan dari server aplikasi. Menghitung stempel waktu dalam aplikasi dapat menyebabkan masalah karena latensi jaringan bervariasi, klien mengalami pergeseran jam yang sedikit berbeda, dan bahasa pemrograman yang berbeda terkadang menghitung waktu sedikit berbeda.
SQLAlchemy memungkinkan Anda untuk melakukan ini dengan melewati func.now()
atau func.current_timestamp()
(mereka adalah alias satu sama lain) yang memberitahu DB untuk menghitung timestamp itu sendiri.
Gunakan SQLALchemy server_default
Selain itu, untuk default di mana Anda sudah memberi tahu DB untuk menghitung nilainya, umumnya lebih baik digunakan server_default
daripada default
. Ini memberitahu SQLAlchemy untuk memberikan nilai default sebagai bagian dari CREATE TABLE
pernyataan.
Misalnya, jika Anda menulis skrip ad hoc pada tabel ini, menggunakan server_default
cara yang berarti Anda tidak perlu khawatir menambahkan panggilan timestamp secara manual ke skrip Anda - database akan mengaturnya secara otomatis.
Memahami SQLAlchemy onupdate
/server_onupdate
SQLAlchemy juga mendukung onupdate
sehingga kapan pun baris diperbarui, akan menyisipkan stempel waktu baru. Sekali lagi, sebaiknya beri tahu DB untuk menghitung timestamp itu sendiri:
from sqlalchemy.sql import func
time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())
Ada server_onupdate
parameter, tetapi tidak seperti server_default
itu, itu tidak benar-benar mengatur apa pun sisi server. Ini hanya memberitahu SQLalchemy bahwa database Anda akan mengubah kolom ketika pembaruan terjadi (mungkin Anda membuat pemicu pada kolom ), jadi SQLAlchemy akan meminta nilai kembali sehingga dapat memperbarui objek yang sesuai.
Satu potensi gotcha lainnya:
Anda mungkin terkejut melihat bahwa jika Anda membuat banyak perubahan dalam satu transaksi, mereka semua memiliki stempel waktu yang sama. Itu karena standar SQL menentukan bahwa CURRENT_TIMESTAMP
mengembalikan nilai berdasarkan pada awal transaksi.
PostgreSQL menyediakan non-SQL-standar statement_timestamp()
dan clock_timestamp()
yang melakukan perubahan dalam suatu transaksi. Documents di sini: https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
Stempel waktu UTC
Jika Anda ingin menggunakan cap waktu UTC, potongan implementasi untuk func.utcnow()
disediakan dalam dokumentasi SQLAlchemy . Anda perlu menyediakan fungsi spesifik driver yang sesuai sendiri.