Tính toán dấu thời gian trong DB của bạn, không phải máy khách của bạn
Đối với sự tỉnh táo, có lẽ bạn muốn tất cả được datetimes
tính toán bởi máy chủ DB của mình, thay vì máy chủ ứng dụng. Tính toán dấu thời gian trong ứng dụng có thể dẫn đến các vấn đề vì độ trễ của mạng là khác nhau, khách hàng trải nghiệm sự trôi dạt đồng hồ hơi khác nhau và các ngôn ngữ lập trình khác nhau đôi khi tính thời gian hơi khác nhau.
SQLAlchemy cho phép bạn thực hiện điều này bằng cách chuyển func.now()
hoặc func.current_timestamp()
(chúng là bí danh của nhau) cho DB biết để tự tính toán dấu thời gian.
Sử dụng SQLALchemy server_default
Ngoài ra, đối với một mặc định mà bạn đã yêu cầu DB tính toán giá trị, nói chung nên sử dụng server_default
thay vì tốt hơn default
. Điều này báo cho SQLAlchemy vượt qua giá trị mặc định như một phần của CREATE TABLE
câu lệnh.
Ví dụ: nếu bạn viết một tập lệnh ad hoc dựa vào bảng này, sử dụng server_default
có nghĩa là bạn sẽ không cần phải lo lắng về việc thêm thủ công cuộc gọi dấu thời gian vào tập lệnh của mình - cơ sở dữ liệu sẽ tự động đặt nó.
Hiểu về SQLAlchemy onupdate
/server_onupdate
SQLAlchemy cũng hỗ trợ onupdate
để bất cứ khi nào hàng được cập nhật, nó sẽ chèn dấu thời gian mới. Một lần nữa, tốt nhất là nói với DB để tự tính toán dấu thời gian:
from sqlalchemy.sql import func
time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())
Có một server_onupdate
tham số, nhưng không giống như server_default
, nó không thực sự đặt bất kỳ máy chủ nào. Nó chỉ cho SQLalchemy biết rằng cơ sở dữ liệu của bạn sẽ thay đổi cột khi có cập nhật (có lẽ bạn đã tạo một kích hoạt trên cột ), vì vậy SQLAlchemy sẽ yêu cầu giá trị trả về để nó có thể cập nhật đối tượng tương ứng.
Một Gotcha tiềm năng khác:
Bạn có thể ngạc nhiên khi nhận thấy rằng nếu bạn thực hiện một loạt các thay đổi trong một giao dịch, tất cả chúng đều có cùng dấu thời gian. Đó là bởi vì tiêu chuẩn SQL chỉ định CURRENT_TIMESTAMP
trả về các giá trị dựa trên thời điểm bắt đầu giao dịch.
PostgreSQL cung cấp phi SQL chuẩn statement_timestamp()
và clock_timestamp()
đó làm thay đổi trong một giao dịch. Tài liệu ở đây: https://www.postgresql.org/docs/civerse/static/fifts-datetime.html#FUNCTIONS-DATETIME-CURRENT
Dấu thời gian UTC
Nếu bạn muốn sử dụng dấu thời gian UTC, một sơ khai thực hiện func.utcnow()
được cung cấp trong tài liệu SQLAlchemy . Bạn cần phải tự cung cấp các chức năng cụ thể cho trình điều khiển phù hợp.