psycopg2 неправильно обрабатывает "часовой пояс ('America / Chica go', now ())" - PullRequest
0 голосов
/ 28 января 2020
def fetch_last_recorded_activity_date(l_pgsql_pool, l_pg_conn, l_sql_statement):
    """

    :param l_pgsql_pool: Postgres Connection Pool
    :param l_pg_conn: Postgres connection object to run various operations
    :return:
    """
    try:
        with l_pg_conn.cursor() as cur:  # If connectionPool is being used whilte creating new connection,it
            # tries to use existing connection as much as possible. With in connection, you can have multiple cursors
            # for various operations
            cur.execute(l_sql_statement)
            last_recorded_activity_details = cur.fetchone()
            return last_recorded_activity_details

    except (Exception, psycopg2.Error) as error:
        log.error(error)
    finally:
        if cur is not None:
            cur.close()


    while True:
            doc = {}
            sql_statement = """
                             select max(completed_date) at time zone 'utc' at time zone 'america/Chicago' as LastRecordedDate, timezone('america/Chicago',now()) as TimeofCheck
                             from adw.activity_fact
                             where completed_date at time zone 'utc' at time zone 'america/Chicago' between current_date and current_date+1               
                             """
            last_recorded_activity_date, current_date_frm_server = fetch_last_recorded_activity_date(
                pgsql_pool, pg_conn,sql_statement)
            log.debug(
                'Last recorded activity date: {} Servertime when pgsql'
                ' to fetch last recorded activity date is executed: {}'
                    .format(last_recorded_activity_date, current_date_frm_server)
            )
            time.sleep(20)
            sql_statement=''
            current_date_frm_server = None

Я пытаюсь получить время выполнения запроса с сервера. Для этого я использую timezone('America/Chicago', now()) как TimeofCheck в операторе SQL.

Я отправляю запрос на Postgres каждые 20 секунд. Пожалуйста, найдите соответствующий код выше. Так или иначе, psycopg2 кеширует результат TimeofCheck и не обновляется вообще. Приведенный выше скрипт генерирует следующие результаты.

01-27 16:40:57 [DEBUG: MainProcess] Дата последней записи активности: 2020-01-27 16: 39: 53.028000 Время сервера при pg sql для извлечения даты последней записанной активности выполнено: 2020-01-27 16: 41: 05.033359

01-27 16:41:18 [DEBUG: MainProcess] Дата последней записанной активности: 2020-01-27 16: 39: 55.385000 Время сервера, когда выполняется pg sql для извлечения последней записанной даты активности: 2020-01-27 16: 41: 05.033359

01-27 16:41:38 [DEBUG: MainProcess] Last дата зарегистрированной активности: 2020-01-27 16: 40: 42.074000 Время сервера, когда выполняется pg sql для извлечения даты последней записанной активности: 2020-01-27 16: 41: 05.033359

01-27 16: 41:59 [DEBUG: MainProcess] Дата последней записанной активности: 2020-01-27 16: 40: 50.706000 Время сервера, когда выполняется pg sql для извлечения даты последней записанной активности: 2020-01-27 16: 41: 05.033359

01-27 16:42:19 [DEBUG: MainProcess] Дата последней записанной активности: 2020-01-27 16: 41: 30.628000 Время сервера при pg * 1 034 * для извлечения даты последней записанной активности выполнено: 2020-01-27 16: 41: 05.033359

01-27 16:42:39 [DEBUG: MainProcess] Дата последней записанной активности: 2020-01-27 16: 41: 30.628000 Серверное время, когда выполняется pg sql для извлечения последней записанной даты активности: 2020-01-27 16: 41: 05.033359

Получает LastRecordedDate правильно, но каким-то образом TimeOfCheck возвращает постоянное значение.

Информация о среде

Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 12:04:33)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print(psycopg2.__version__)
2.8.4 (dt dec pq3 ext lo64)

1 Ответ

2 голосов
/ 28 января 2020

now () - это отметка времени в начале транзакции, и все ваши запросы выполняются в одной транзакции. Поэтому все они имеют одну и ту же метку времени. Вы должны либо использовать режим автоматической фиксации, либо зафиксировать транзакцию между каждым оператором. Не рекомендуется держать транзакцию открытой дольше, чем нужно, поэтому вам следует закрыть ее перед сном.

...