2015-07-30 13 views
5

Tôi đã có một bảng SQLAlchemy được định nghĩaPostgres + SQLAlchemy chuyển đổi thời gian để tính theo giờ UTC khi sử dụng mặc định = func.now()

foo_table = Table('foo', metadata, 
    Column('id', Integer, primary_key=True), 
    Column('created_on', DateTime, default=func.now()), 
    ... 
) 

mà tạo ra một bảng trong Postgres

CREATE TABLE foo 
(
    id serial NOT NULL, 
    created_on timestamp without time zone, 
    ... 
) 

Các múi giờ địa phương được đặt chính xác (hãy kiểm tra xem datetime.datetime.now() của Python có hiển thị giờ địa phương của tôi không), nhưng bất cứ khi nào tôi chèn hàng vào foo_table mà không đặt rõ ràng created_on, thời gian được sử dụng là UTC hiện tại thay vì giờ địa phương của tôi (ví dụ: "2015-07-29 16: 38: 08.112192 ").

Khi tôi cố gắng đặt created_on theo cách thủ công, tất cả đều hoạt động tốt, nhưng có vẻ như Postgres hoặc SQLAlchemy đang chuyển đổi thời gian thành UTC khi để nó lên đến func.now() để chỉ định dấu thời gian.

Làm cách nào để có thể nhận SQLAlchemy hoặc Postgres để tạo bản ghi với thời gian địa phương hiện tại của tôi?

Trả lời

1

Phần quan trọng ở đây là cột created_on được định nghĩa là "dấu thời gian không có múi giờ".

Từ tài liệu ở đây:

http://www.postgresql.org/docs/current/static/datatype-datetime.html

Trong một nghĩa đen mà đã được xác định là dấu thời gian mà không cần múi giờ, PostgreSQL sẽ âm thầm bỏ qua bất kỳ dấu hiệu múi giờ. Tức là, giá trị kết quả được lấy từ các trường ngày/thời gian trong giá trị đầu vào, và không được điều chỉnh theo múi giờ.

Đối với dấu thời gian có múi giờ, giá trị được lưu trữ nội bộ luôn ở dạng UTC (Thời gian phối hợp chung, theo truyền thống được gọi là Giờ trung bình Greenwich, GMT). Giá trị đầu vào có múi giờ rõ ràng được chỉ định được chuyển thành UTC bằng cách sử dụng chênh lệch thích hợp cho múi giờ đó. Nếu không có múi giờ được ghi trong chuỗi đầu vào, thì nó được giả định là trong múi giờ được chỉ ra bởi tham số TimeZone của hệ thống và được chuyển thành UTC bằng cách sử dụng bù đắp cho múi giờ.

Vì vậy, trên thực tế, bạn đang loại bỏ thông tin múi giờ, chỉ để bạn có ngày UTC được lưu trữ.

Trong trường hợp của SQLAlchemy, để tạo ra các cột với "dấu thời gian với múi giờ", bạn sẽ cần phải thêm cái gì đó để tác động của:

DateTime (múi giờ = True)

theo tài liệu ở đây:

http://docs.sqlalchemy.org/en/rel_0_9/core/type_basics.html

nào nên cho phép bạn lưu các thông tin múi giờ bạn mong muốn, và lấy nó là tốt.

Hy vọng rằng sẽ giúp trả lời câu hỏi của bạn và giúp bạn trên con đường của bạn. May mắn nhất. =)

+1

Tôi không muốn lưu trữ thông tin múi giờ. Hệ thống nên là thời gian bất khả tri và 'func.now()' sẽ hoạt động giống như cách khởi tạo 'created_on = datetime.datetime.now()'. – orange

+0

Tôi nghĩ rằng 'dấu thời gian không có múi giờ AT Múi giờ ZONE có thể phù hợp hơn với thời gian địa phương: http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME -ZONECONVERT – orange

+0

Thậm chí tốt hơn, đặt dấu thời gian múi giờ mục tiêu được chuyển đổi thành được giải thích tại đây: http://serverfault.com/questions/554359/postgresql-timezone-does-not-match-system-timezone. Điều này sẽ không yêu cầu bất kỳ thay đổi mã nào. – orange

Các vấn đề liên quan