คำนวณเวลาประทับภายในฐานข้อมูลของคุณไม่ใช่ลูกค้าของคุณ
เพื่อความมีสติคุณอาจต้องการdatetimesคำนวณโดยเซิร์ฟเวอร์ DB ของคุณทั้งหมดแทนที่จะเป็นแอปพลิเคชันเซิร์ฟเวอร์ การคำนวณเวลาประทับในแอปพลิเคชันสามารถนำไปสู่ปัญหาได้เนื่องจากเวลาในการตอบสนองของเครือข่ายเป็นตัวแปรไคลเอนต์จะได้สัมผัสกับนาฬิกาที่แตกต่างกันเล็กน้อยและภาษาการเขียนโปรแกรมที่แตกต่างกันในบางครั้ง
SQLAlchemy ช่วยให้คุณทำสิ่งนี้ได้โดยการผ่านfunc.now()หรือfunc.current_timestamp()(เป็นนามแฝงของกันและกัน) ซึ่งบอกให้ DB คำนวณค่าเวลาประทับเอง
ใช้ SQLALchemy's server_default
นอกจากนี้สำหรับเริ่มต้นที่คุณแล้วบอก DB ในการคำนวณค่าโดยทั่วไปดีกว่าที่จะใช้แทนserver_default defaultสิ่งนี้บอกให้ SQLAlchemy ส่งผ่านค่าเริ่มต้นซึ่งเป็นส่วนหนึ่งของCREATE TABLEคำสั่ง
ตัวอย่างเช่นหากคุณเขียนสคริปต์เฉพาะกิจกับตารางนี้การใช้server_defaultหมายความว่าคุณไม่ต้องกังวลเกี่ยวกับการเพิ่มการเรียกเวลาประทับลงในสคริปต์ของคุณด้วยตนเองฐานข้อมูลจะตั้งค่าโดยอัตโนมัติ
ทำความเข้าใจกับ SQLAlchemy onupdate/server_onupdate
SQLAlchemy รองรับonupdateเช่นกันเมื่อใดก็ตามที่แถวนั้นได้รับการปรับปรุงจะมีการประทับเวลาใหม่ อีกครั้งที่ดีที่สุดที่จะบอก DB เพื่อคำนวณการประทับเวลาของตัวเอง:
from sqlalchemy.sql import func
time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())
มีserver_onupdateพารามิเตอร์ แต่ไม่เหมือนserver_defaultกันที่จริงแล้วมันไม่ได้ตั้งค่าเซิร์ฟเวอร์ใด ๆ เลย มันเพิ่งบอก SQLalchemy ว่าฐานข้อมูลของคุณจะเปลี่ยนคอลัมน์เมื่อมีการอัพเดทเกิดขึ้น (บางทีคุณอาจสร้างทริกเกอร์ในคอลัมน์ ) ดังนั้น SQLAlchemy จะขอค่าส่งคืนเพื่อให้สามารถอัปเดตวัตถุที่สอดคล้องกันได้
gotcha ที่มีศักยภาพอื่น ๆ :
คุณอาจประหลาดใจที่สังเกตเห็นว่าหากคุณทำการเปลี่ยนแปลงหลายอย่างภายในธุรกรรมเดียวพวกเขาทั้งหมดมีเวลาประทับเดียวกัน นั่นเป็นเพราะมาตรฐาน SQL ระบุว่าCURRENT_TIMESTAMPจะส่งคืนค่าตามจุดเริ่มต้นของการทำธุรกรรม
PostgreSQL ให้ไม่ใช่ SQL มาตรฐานstatement_timestamp()และclock_timestamp()ที่ทำการเปลี่ยนแปลงภายในการทำธุรกรรม เอกสารที่นี่: https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
UTC ประทับเวลา
หากคุณต้องการใช้ UTC timestamps จะมี stub of Implement สำหรับไว้func.utcnow()ในเอกสารคู่มือSQLAlchemy คุณจำเป็นต้องจัดเตรียมฟังก์ชั่นการใช้งานเฉพาะสำหรับไดรเวอร์ให้เหมาะสมด้วยตัวคุณเอง