использование sqlite3 в python с ключевым словом "WITH"

115
11

Я занимался учебным пособием и натолкнулся на способ обработки связей с sqlite3. Затем я изучил ключевое слово WITH и выяснил, что это альтернатива попробовать, за исключением, наконец, способа делать вещи

Было сказано, что в случае обработки файлов "WITH" автоматически обрабатывает закрытие файлов, и я думал, что это похоже на соединение, как сказано в учебнике zetcode:

"С ключевым словом" c "интерпретатор Python автоматически освобождает ресурсы, а также обеспечивает обработку ошибок". http://zetcode.com/db/sqlitepythontutorial/

поэтому я подумал, что было бы хорошо использовать этот способ обработки вещей, но я не мог понять, почему работают операторы (внутренний масштаб и внешний охват)? не должно ли СО освободить соединение?

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')

Я не знаю, что именно делает здесь СЕТ (или вообще), поэтому, если вам будет интересно рассказать об использовании с TRY CATCH в этом контексте.

И должны ли соединения открываться и закрываться для каждого запроса? (Я формулирую запросы внутри функции, которую я вызываю каждый раз с аргументом). Будет ли это хорошей практикой?

спросил(а) 2013-10-22T18:45:00+04:00 6 лет, 8 месяцев назад
1
Решение
96

Из документов: http://docs.python.org/2/library/sqlite3.html#using-the-connection-as-a-context-manager

Объекты подключения могут использоваться в качестве менеджеров контекста, которые автоматически совершают транзакции или откатываются. В случае исключения транзакция откатывается; в противном случае транзакция совершается:

Таким образом, диспетчер контекста не освобождает соединение, вместо этого он гарантирует, что любые транзакции, происходящие в соединении, откатываются, если возникает какое-либо исключение, или совершено иначе... Полезно для запросов DELETE, UPDATE и INSERT например.

ответил(а) 2013-10-22T18:51:00+04:00 6 лет, 8 месяцев назад
93

В общем, менеджер контекста может делать все, что хочет его автор, когда он используется. Установка/сброс определенного состояния системы, очистка ресурсов после использования, получение/освобождение блокировки и т.д.

В частности, как пишет Джон, объект подключения к базе данных создает транзакцию при использовании в качестве менеджера контекста. Если вы хотите автоматически закрыть соединение, вы можете сделать


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

ответил(а) 2013-10-22T20:38:00+04:00 6 лет, 8 месяцев назад
38

Вы также можете написать свой собственный обертку 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

ответил(а) 2018-06-01T17:19:00+03:00 2 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема