İstemciniz değil DB'nizdeki zaman damgalarını hesaplayın
Akıl sağlığı için, muhtemelen datetimes
uygulama sunucusu yerine DB sunucunuz tarafından hesaplanmasını istersiniz . Uygulamadaki zaman damgasının hesaplanması ağ gecikmesi değişken olduğundan, istemciler biraz farklı saat sapması yaşadığından ve farklı programlama dilleri zaman zaman biraz farklı hesapladığından sorunlara yol açabilir.
SQLAlchemy bunu geçerek func.now()
veya func.current_timestamp()
(birbirlerinin takma adlarıdır) DB'ye zaman damgasının kendisini hesaplamasını söyler.
SQLALchemy's'i kullanın server_default
Ayrıca, DB'ye zaten değeri hesaplamasını söylediğiniz bir varsayılan değer için, genellikle server_default
yerine kullanmak daha iyidir default
. Bu, SQLAlchemy'ye CREATE TABLE
deyimin bir parçası olarak varsayılan değeri geçirmesini söyler .
Örneğin, bu tabloya geçici bir komut dosyası yazarsanız, komut dosyasını server_default
manuel olarak bir zaman damgası çağrısı ekleme konusunda endişelenmenize gerek kalmayacak araçları kullanarak veritabanı otomatik olarak ayarlayacaktır.
SQLAlchemy'yi Anlamak onupdate
/server_onupdate
SQLAlchemy ayrıca onupdate
satır her güncellendiğinde yeni bir zaman damgası ekler. Yine, DB'ye zaman damgasının kendisini hesaplamasını söylemek en iyisidir:
from sqlalchemy.sql import func
time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())
Bir server_onupdate
parametre var, ancak aksine server_default
, aslında hiçbir şey sunucu tarafı ayarlamıyor. Sadece SQLalchemy'ye bir güncelleme gerçekleştiğinde veritabanınızın sütunu değiştireceğini söyler (belki de sütunda bir tetikleyici oluşturdunuz ), böylece SQLAlchemy karşılık gelen nesneyi güncelleyebilmesi için dönüş değerini soracaktır.
Bir potansiyel potansiyel daha var:
Tek bir işlemde bir sürü değişiklik yaparsanız, hepsinin aynı zaman damgasına sahip olduğunu fark edebilirsiniz. Bunun nedeni, SQL standardının CURRENT_TIMESTAMP
işlemin başlangıcına göre değerleri döndürdüğünü belirtmesidir .
PostgreSQL SQL dışı standart sağlar statement_timestamp()
ve clock_timestamp()
hangi yapmak bir işlem içinde değişiklik. Buradaki dokümanlar: https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
UTC zaman damgası
UTC zaman damgalarını kullanmak istiyorsanız func.utcnow()
, SQLAlchemy belgelerinde bir uygulama saplaması sağlanır . Yine de, sürücüye özgü uygun işlevleri kendi başınıza sağlamanız gerekir.