использование 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