В чем разница между `cursor.execute()` и `conn.execute()?` sqlite3

Делал разные команды с UPDATE,SELECT,INSERT и не понял разницы между cursor и conn. Работают оба одинаково. Объясните пожалуйста


Ответы (2 шт):

Автор решения: E1mir

cursor.execute() используется для выполнения SQL-запросов через конкретный курсор.

conn.execute() нужен для одиночных запросов через объект соединения.Этот метод создает временный курсор, выполняет запрос и закрывает курсор. Это удобно для одноразовых запросов.

Пример:

import sqlite3

conn = sqlite3.connect('example.db')

# Используя cursor.execute()
cursor = conn.cursor()
cursor.execute('SELECT * FROM table_name')

# Используя conn.execute()
conn.execute('DELETE FROM table_name WHERE condition')

Использование cursor предоставляет дополнительное управление при выполнении SQL-запросов. То есть использование cursor обеспечивает более гибкое управление и более широкие возможности в сравнении с conn.execute(), что особенно полезно при более сложных сценариях работы с базой данных.

Вот пример:

import sqlite3

conn = sqlite3.connect('example.db')

cursor = conn.cursor()

# Выполнение запроса
cursor.execute('SELECT * FROM table_name')

# Извлечение результатов
result = cursor.fetchall()

# Управление транзакцией
cursor.execute('UPDATE table_name SET column_name = value WHERE condition')
conn.commit()
→ Ссылка
Автор решения: Oopss

Нашел в док при вызове Connection.execute() cursor создается неявно.
Немного напрягает "часто излишние", не знаю когда не лишнее.

Использовать методы быстрого доступа к соединению

Используя методы execute(), executemany() и executescript() класса Connection, ваш код может быть написан более лаконично, поскольку вам не нужно явно создавать (часто излишние) объекты Cursor. Вместо этого объекты Cursor создаются неявно, а эти методы быстрого доступа возвращают объекты курсора. Таким образом, вы можете выполнить оператор SELECT и выполнить итерацию по нему напрямую, используя только один вызов объекта Connection.
# СОздать и заполнить.
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(name, first_appeared)")
data = [
    ("C++", 1985),
    ("Objective-C", 1984),
]
con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data)

# Вывод выборки
for row in con.execute("SELECT name, first_appeared FROM lang"):
    print(row)

print("I just deleted", con.execute("DELETE FROM lang").rowcount, "rows")

# close() не является методом быстрого доступа и не вызывается автоматически;
# объект соединения должен быть закрыт вручную
con.close()
→ Ссылка