Обратите внимание, что начиная с Python2.6, sqlite.connect
возвращает менеджер контекста :
Объекты соединения могут использоваться как контекстные менеджеры, которые автоматически
фиксация или откат транзакций. В случае исключения
откат транзакции; в противном случае транзакция совершается:
Следовательно, не украшает соединение с contextlib.closing
- иначе вы потеряете поведение фиксации / отката и вместо этого получите только connection.close()
, вызванный при выходе из with-statement
.
За PEP249 :
... closing a connection without committing the changes first will cause
an implicit rollback to be performed.
Таким образом, поведение фиксации / отката гораздо полезнее, чем простой вызов close.
Вы можете использовать менеджер контекста :
import contextlib
def query(sql,args):
with contextlib.closing(sqlite3.connect('stocks.db')) as conn:
curs = conn.cursor()
curs.execute(sql,args))
close = curs.fetchall()
return close
def getPrice(self, symbol, date):
date = dt.datetime.strptime(date, '%Y-%m-%d')
sql = '''SELECT close FROM prices WHERE symbol = ? AND date = ?'''
args = (symbol, date)
return query(sql, args)
Поскольку у вас есть много функций, таких как getPrice
, которые отличаются только SQL и аргументами, вы можете уменьшить количество повторяющихся кодов, определив функцию query
.
Вы также можете определить менеджер контекста для отката соединения при ошибках и фиксации, а также закрытия при выходе из блока with. Пример этого (для MySQL) можно найти здесь , адаптировать его к sqlite3 не должно быть сложно ..
Справка: