курсор пост-ГРЭС Python добавляет метку времени к проблеме

def count_lines(filepath):
    with open(filepath, 'r+') as file:
        lines = file.readlines()
        return len(lines)
5
задан adam 19 March 2009 в 17:50
поделиться

3 ответа

Рассматривать вопрос, поставленный Вашими новыми редактированиями:

В PostgreSQL, NOW() не текущее время, но время в начале текущей транзакции. Psycopg2, вероятно, запускает транзакцию неявно для Вас, и так как сделка никогда не заключается (фиксацией или иначе), метка времени вовлекает и становится устаревшей.

Возможные меры:

  • Фиксируйте часто (глупый, если Вы только делаете, ВЫБИРАЕТ),
  • Настроенный Psycopg2 для использования другого поведения для того, чтобы автоматически создать транзакции (вероятно, хитрый для разбираний, и будет влиять на другие части приложения),
  • Используйте другую функцию метки времени, как statement_timestamp() (не SQL-standard-compliant, но в других отношениях идеально подходящий для этого сценария)

Из руководства разделите 9.9.4, добавленный акцент:

PostgreSQL обеспечивает много функций, которые возвращают значения связанный с текущей датой и время. Эти стандартные функции SQL все возвращаемые значения на основе времени начала текущей транзакции:

  • CURRENT_DATE
  • CURRENT_TIME
  • CURRENT_TIMESTAMP
  • CURRENT_TIME(precision)
  • CURRENT_TIMESTAMP(precision)
  • LOCALTIME LOCALTIMESTAMP
  • LOCALTIME(precision)
  • LOCALTIMESTAMP(precision)

CURRENT_TIME и CURRENT_TIMESTAMP поставьте значения с часовым поясом; LOCALTIME и LOCALTIMESTAMP поставьте значения без часового пояса.

CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME, и LOCALTIMESTAMP может дополнительно быть дан параметр точности, который заставляет результат быть округленным к этому много дробных цифр в поле секунд. Без параметра точности результат дан полной доступной точности.

...

Так как эти функции возвращают время начала текущей транзакции, их значения не изменяются во время транзакции. Это считают функцией: намерение состоит в том, чтобы позволить единственной транзакции иметь последовательное понятие "текущего" времени, так, чтобы несколько модификаций в рамках той же транзакции перенесли ту же метку времени.

Примечание: Другие системы баз данных могли бы совершенствовать эти значения более часто.

PostgreSQL также обеспечивает функции, которые возвращают время начала текущего оператора, а также фактическое текущее время в момент, функция вызвана. Полный список non-SQL-standard функций времени:

  • now()
  • transaction_timestamp()
  • statement_timestamp()
  • clock_timestamp()
  • timeofday()

now() традиционный PostgreSQL, эквивалентный CURRENT_TIMESTAMP. transaction_timestamp() аналогично эквивалентно CURRENT_TIMESTAMP, но назван для ясного отражения то, что это возвращает. statement_timestamp() возвращает время начала текущего оператора (более конкретно, время получения последнего сообщения команды от клиента). statement_timestamp() и transaction_timestamp() возвратите то же значение во время первой команды транзакции, но мог бы отличаться во время последующих команд. clock_timestamp() возвращает фактическое текущее время и поэтому его изменения значения даже в рамках единственной команды SQL. timeofday() историческая функция PostgreSQL. Как clock_timestamp(), это возвращает фактическое текущее время, но как строка форматированного текста, а не метка времени со значением часового пояса.

1
ответ дан 15 December 2019 в 01:11
поделиться

Попытайтесь назвать c.close (), как описано в документации модуля: http://tools.cherrypy.org/wiki/Databases

def add_timestamp(self):
        c = cherrypy.thread_data.db.cursor()
        now = datetime.datetime.now()
        c.execute("insert into test (given_time) values ('%s')" % now)
        c.connection.commit()
        c.close()
        raise cherrypy.HTTPRedirect('/')

def get_timestamps(self):
        c = cherrypy.thread_data.db.cursor()
        c.execute("select * from test order by given_time desc limit 10")
        records = c.fetchall()
        c.close()
        return records
3
ответ дан 15 December 2019 в 01:11
поделиться

Я добавил фиксацию к методу, который выбирает метки времени, и это решило проблему.

 def get_timestamps(self):
    c = cherrypy.thread_data.db.cursor()
    c.execute("select * from test order by given_time desc limit 10")
    records = c.fetchall()
    c.connection.commit()  # Adding this line fixes the timestamp issue
    c.close()
    return records

Кто-либо может объяснить, почему я должен был бы назвать cursor.connection.commit (), когда все, что я делаю, является выбором?

0
ответ дан 15 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: