คำนวณเวลาประทับภายในฐานข้อมูลของคุณไม่ใช่ลูกค้าของคุณ
เพื่อความมีสติคุณอาจต้องการ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 คุณจำเป็นต้องจัดเตรียมฟังก์ชั่นการใช้งานเฉพาะสำหรับไดรเวอร์ให้เหมาะสมด้วยตัวคุณเอง