PostgreSQL SQLalchemy и временная метка с часовым поясом, почему инкогнито отличается от обычного? - PullRequest
0 голосов
/ 01 февраля 2019

Я использую колбу sqlalchemy и postgreSQL, и у меня возникают проблемы с отображаемыми датами, при исследовании этой проблемы я обнаружил еще одну странную вещь:

Создание записи в БД в режиме инкогнито (вкладка браузера Chrome) даетразное / неправильное время.РЕДАКТИРОВАТЬ: Это не имеет ничего общего с режимом инкогнито, оба случая также происходят в обычном режиме.Я еще не понял, почему.

Это код:

Я изменил часовой пояс по умолчанию для моей базы данных:

ALTER DATABASE postgres SET timezone TO 'Europe/Berlin';

модель:

class User(UserMixin, Base):
    __tablename__ = 'users'
    date_added = Column(DateTime(timezone=True), nullable=False)

Метод, который я использую для добавления даты и времени в БД:

date_added=datetime.today()

Как это выглядит в БД (мое местное время в это время было 13:53:46):

Создание записи не в режиме инкогнито

timestamp with time zone
2019-02-01 13:53:46.73817+01

Создание записи в режиме инкогнито

timestamp with time zone
2019-02-01 12:53:46.73817+01

Это действительно меня беспокоит.Это просто неправильно.Даже если бы я конвертировал объекты datetime в localtime.Обе записи были сделаны одновременно, но показывают разные результаты, как это возможно?

Кроме того, при просмотре этих дат в HTML postgreSQL не применяет смещение, поэтому первая дата выглядит правильно, новторое неверно.

Изначально я просто хотел найти способ хранить ВСЕ объекты даты и времени в Европе / Берлине и возвращать их в Европе / Берлине, поэтому мне не нужно конвертировать UTC в Европу / Берлин, но сейчасЯ думаю, что что-то пошло не так.

Я также дважды проверил свой код везде, я не использую другие методы для манипулирования объектами даты и времени.

EDIT

Я сохраняю дату и время каждый раз, когда пользователь входит в систему. В настоящее время я пробовал это делать не на инкогнито.Мое местное время составляет 14:13:33, но оно сохраняется в БД: 2019-02-01 13:13:33.804339+01.Как это вообще возможно?Я знаю, что это не может быть случайным, но сейчас это выглядит как случайное время сохранения, иногда UTC со смещением, а иногда Европа / Берлин со смещением.

РЕДАКТИРОВАТЬ

Я удваиваюсьпроверил все таблицы с помощью SHOW timezone;, и все они правильно вернули Europe/Berlin

1 Ответ

0 голосов
/ 09 февраля 2019

datetime.today() возвращает метку времени без информации о часовом поясе текущего местного времени (возвращаемое значение - часовой пояс наивный ).Корень вашей проблемы в том, что где-то между адаптером postgres для SQL Alchemy и самим postgres он должен угадывать в часовом поясе.Как вы можете себе представить, компьютерные системы склонны использовать UTC, если часовой пояс явно не указан, но точная логика для набора инструментов может быть сложной и трудной для отладки (и моя зависимость от настроек локального часового пояса на вашем компьютере, системный уровень)настройки в БД, настройки уровня сеанса и предпочтения создателя инструмента).Вы можете обойти всю эту червячную банку одним из следующих способов:

  1. Сохранение всех ваших меток времени без часового пояса в формате UTC, а затем преобразование в нужную метку времени в зависимости от ситуации

  2. Всегда используйте временные метки с часовым поясом (т.е. замените datetime.today() на datetime.now() и передайте в желаемом часовом поясе, чтобы вы всегда имели дело с осведомленным о часовом поясе значением), поэтомукомпьютеру не требуется указывать часовой пояс.

Обратите внимание, что в postgres тип timestamp with time zone по-прежнему всегда сохраняется как UTC без дополнительной информации, база данных просто использует сеансКонфигурация уровня, чтобы решить, какой часовой пояс отображать, как при выводе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...