В чем разница между `cursor.execute()` и `conn.execute()?` sqlite3
Делал разные команды с UPDATE,SELECT,INSERT и не понял разницы между cursor и conn. Работают оба одинаково. Объясните пожалуйста
Ответы (2 шт):
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()
Нашел в док при вызове 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()