использование sqlite3 в python с ключевым словом "WITH"
Я делал учебник и наткнулся на способ обработки соединений с sqlite3, Затем я изучил ключевое слово WITH и узнал,что это альтернатива попробовать,кроме, наконец, способа сделать что-то
было сказано, что в случае обработки файлов "с" автоматически обрабатывает закрытие файлов, и я подумал, что это похоже на соединение, как сказано в учебнике zetcode: -
" С ключевым словом with интерпретатор Python автоматически освобождает этот ресурсы. Он также обеспечивает обработку ошибок."http://zetcode.com/db/sqlitepythontutorial/
поэтому я подумал, что было бы хорошо использовать этот способ обработки вещей, но я не мог понять, почему работают оба (внутренняя область и внешняя область) утверждения? не должен ли WITH освободить соединение?
import sqlite3
con = sqlite3.connect('test.db')
with con:
cur = con.cursor()
cur.execute('SELECT 1,SQLITE_VERSION()')
data = cur.fetchone()
print data
cur.execute('SELECT 2,SQLITE_VERSION()')
data = cur.fetchone()
print data
выходы
(1, u'3.6.21')
(2, u'3.6.21')
Я не знаю, что именно делает здесь(или делает вообще), поэтому, если вы, пожалуйста, подробно остановитесь на использование с over TRY CATCH в этом контексте.
и должны ли соединения открываться и закрываться по каждому запросу? (Я формулирую запросы внутри функции, которую я вызываю каждый раз с аргументом) было бы хорошей практикой?
3 ответов
из документов: http://docs.python.org/2/library/sqlite3.html#using-the-connection-as-a-context-manager
объекты подключения могут использоваться в качестве контекстных менеджеров, которые автоматически фиксируют или откатывают транзакции. В случае исключения транзакция откатывается; в противном случае транзакция фиксируется:
Итак, менеджер контекста не релиз соединение, вместо этого, оно обеспечивает что любое транзакции, происходящие на соединении, откатываются, если возникает какое-либо исключение, или фиксируются иным образом... Полезно для DELETE
, UPDATE
и INSERT
запросы к примеру.
В общем, менеджер контекста может делать все, что хочет его автор, когда он используется. Установка / сброс определенного состояния системы, очистка ресурсов после использования, получение/освобождение блокировки и т. д.
в частности, as Джон уже пишет объект подключения к базе данных, создает транзакцию при использовании в качестве контекста менеджера. Если вы хотите автоматически закрыть соединение, вы можете сделать
with contextlib.closing(sqlite3.connect('test.db')) as con:
with con as cur:
cur.execute('SELECT 1,SQLITE_VERSION()')
data = cur.fetchone()
print data
with con as cur:
cur.execute('SELECT 2,SQLITE_VERSION()')
data = cur.fetchone()
print data
вы также можете написать свою собственную оболочку вокруг sqlite3 для поддержки with
:
class SQLite():
def __init__(self, file='sqlite.db'):
self.file=file
def __enter__(self):
self.conn = sqlite3.connect(self.file)
self.conn.row_factory = sqlite3.Row
return self.conn.cursor()
def __exit__(self, type, value, traceback):
self.conn.commit()
self.conn.close()
with SQLite('test.db') as cur:
print(cur.execute('select sqlite_version();').fetchall()[0][0])
https://docs.python.org/2.5/whatsnew/pep-343.html#SECTION000910000000000000000