Python sqlite3.executemany: обновить строки пакетом
Cursor.executemany() применяет один параметризованный DML-запрос к последовательности наборов значений. Так удобно обновить много строк, не собирая SQL через форматирование строк. Пример использует SQLite в памяти и показывает число затронутых записей.
Обновить статусы задач
Каждая пара передаёт новый статус и идентификатор строки в порядке соответствующих ?:
import sqlite3
updates = [
("done", 1),
("blocked", 2),
]
with sqlite3.connect(":memory:") as con:
con.execute(
"CREATE TABLE task (id INTEGER PRIMARY KEY, status TEXT NOT NULL)"
)
con.executemany(
"INSERT INTO task(id, status) VALUES (?, ?)",
[(1, "new"), (2, "new")],
)
cursor = con.executemany(
"UPDATE task SET status = ? WHERE id = ?",
updates,
)
print("Изменено строк:", cursor.rowcount)
print(con.execute("SELECT id, status FROM task ORDER BY id").fetchall())Не вставляйте значения в запрос через f-строки: placeholders передают данные отдельно и защищают от SQL-инъекции. Контекст with фиксирует транзакцию при успехе и откатывает её при исключении.
executemany() повторно выполняет один DML-запрос для каждого элемента iterable. Он не возвращает строки из RETURNING; для получения результата используйте execute() и прочитайте курсор. rowcount доступен после завершения операции.
Документация: sqlite3.Cursor.executemany, параметры запроса.