2015-07-30 13 views
5

Mam tabelę sqlalchemy zdefiniowanąPostgres + sqlalchemy czasu do UTC konwersji przy użyciu default = func.now()

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

która tworzy tabelę w PostgreSQL

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

lokalna strefa czasowa jest ustawiona prawidłowo (zaznaczono, że Python datetime.datetime.now() wyświetla mój czas lokalny), ale zawsze, gdy wstawiam wiersz w foo_table bez jawnego ustawienia created_on, użyty czas to aktualny UTC zamiast mojego lokalnego czasu (np. "2015-07-29 16: 38: 08.112192 ").

Kiedy próbuję ustawić created_on ręcznie, wszystko działa dobrze, ale wydaje się, że Postgres lub SQLAlchemy konwertują czas na UTC, pozostawiając go do func.now(), aby przypisać znacznik czasu.

Jak mogę uzyskać SQLAlchemy lub Postgres, aby utworzyć rekord z moim bieżącym czasem lokalnym?

Odpowiedz

1

Kluczową częścią jest tutaj to, że kolumna created_on jest zdefiniowana jako "znacznik czasu bez strefy czasowej".

Z dokumentacji tutaj:

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

w dosłownym która została ustalona na timestamp bez strefy czasowej, PostgreSQL będzie milcząco ignorować żadnej informacji o strefie czasowej. Oznacza to, że wynikowa wartość pochodzi od pól daty/czasu w wartości wejściowej i nie jest dostosowywana do strefy czasowej.

Dla znacznika czasu ze strefą czasową wewnętrznie zapisana wartość jest zawsze w UTC (uniwersalny czas skoordynowany, tradycyjnie określany jako czas uniwersalny GMT). Wartość wejściowa z określoną określoną strefą czasową jest przekształcana na UTC przy użyciu odpowiedniego przesunięcia dla tej strefy czasowej. Jeśli w łańcuchu wejściowym nie podano żadnej strefy czasowej, zakłada się, że znajduje się ona w strefie czasowej wskazanej przez parametr Strefa czasowa systemu i jest przekształcana na UTC z wykorzystaniem przesunięcia dla strefy strefy czasowej.

W efekcie wyrzucasz informacje o strefach czasowych, które pozostawiają tylko zapisaną datę UTC.

W przypadku SQLAlchemy, aby utworzyć kolumnę "timestamp ze strefy czasowej", trzeba dodać coś do skutku:

DateTime (strefa czasowa = True)

zgodnie z dokumentacją tutaj:

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

które powinny pozwolić zaoszczędzić strefy czasowej ty życzyć i odzyskać go.

Mam nadzieję, że pomogę ci odpowiedzieć na twoje pytanie i sprawię, że staniesz na dobrej drodze. Powodzenia. =)

+1

Nie chcę przechowywać informacji o strefie czasowej. System powinien być agnostykiem czasowym, a 'func.now()' powinno zachowywać się tak samo, jak inicjowanie 'created_on = datetime.datetime.now()'. – orange

+0

Myślę, że 'timestamp bez strefy czasowej w strefie strefy czasowej' może być lepszym rozwiązaniem, które wydaje się respektować czas lokalny: http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME -ZONTONVERT – orange

+0

Jeszcze lepiej, ustaw docelowe znaczniki czasu stref czasowych są konwertowane do, jak wyjaśniono tutaj: http://serverfault.com/questions/554359/postgresql-timezone-does-not-match-system-timezone. Nie wymagałoby to żadnych zmian kodu. – orange

Powiązane problemy