Python sqlite3.executemany: обновить строки пакетом

Категория: Python · Язык: Python · Обновлено:

Cursor.executemany() применяет один параметризованный DML-запрос к последовательности наборов значений. Так удобно обновить много строк, не собирая SQL через форматирование строк. Пример использует SQLite в памяти и показывает число затронутых записей.

Обновить статусы задач

Каждая пара передаёт новый статус и идентификатор строки в порядке соответствующих ?:

Python
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, параметры запроса.