Как открывать базу данных sqlite3 с помощью with Python?
Знаю, что можно базу данных открывать так:
db = sqlite3.connect('orders.db')
sql = db.cursor()
...
db.close()
Но вроде как лучше будет с помощью with. Попробовал сделать так:
db = sqlite3.connect('orders.db')
with db.cursor() as cursor:
...
Но возвращается ошибка:
Traceback (most recent call last):
File "C:\Users\aesok\Desktop\test.py", line 7, in <module>
with db.cursor() as cursor:
AttributeError: __enter__
Ответы (2 шт):
Для работы с контекстным менеджером должны быть реализованы "магические" методы __enter__ и __exit__. В данной библиотеке, если Вы почитаете документацию или посмотрите код, увидите что эти методы не реализованы у объекта Cursor. Но реализованы у объекта Connection. Так что Вы можете сделать так:
import sqlite3
with sqlite3.connect('asd.db') as conn:
cur = conn.cursor()
cur.execute("SELECT 1;")
print(cur.fetchall())
Вы можете сами создать класс для работы с подключением к sqlite3 и реализовать __enter__ и __exit__ методы или с помошью библиотеки contextlib.
Судя по документации контекстный менеджер реализован только для объекта типа sqlite3.Connection, но не для sqlite3.Cursor.
Поэтому можно сделать так:
with sqlite3.connect('orders.db') as con:
cur = con.cursor()
cur.execute(...)
...
При выходе из блока with ... будет автоматически сделан commit.