def count_lines(filepath):
with open(filepath, 'r+') as file:
lines = file.readlines()
return len(lines)
Рассматривать вопрос, поставленный Вашими новыми редактированиями:
В PostgreSQL, NOW()
не текущее время, но время в начале текущей транзакции. 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()
, это возвращает фактическое текущее время, но как строка форматированного текста, а не метка времени со значением часового пояса.
Попытайтесь назвать 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
Я добавил фиксацию к методу, который выбирает метки времени, и это решило проблему.
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 (), когда все, что я делаю, является выбором?