Hitung cap waktu dalam DB Anda, bukan klien Anda
Untuk kewarasan, Anda mungkin ingin semua datetimesdihitung 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_defaultdaripada default. Ini memberitahu SQLAlchemy untuk memberikan nilai default sebagai bagian dari CREATE TABLEpernyataan.
Misalnya, jika Anda menulis skrip ad hoc pada tabel ini, menggunakan server_defaultcara 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 onupdatesehingga 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_onupdateparameter, tetapi tidak seperti server_defaultitu, 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_TIMESTAMPmengembalikan 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.