Sqlite3.Cursor.execute: примеры (PYTHON)

Метод execute курсора SQLite: примеры использования и параметры
Раздел: Базы данных, SQL-запросы
sqlite3.Cursor.execute(sql, parameters): sqlite3.Cursor

Описание функции sqlite3.Cursor.execute

Метод execute объекта Cursor в модуле sqlite3 предназначен для выполнения одной команды SQL. Его основное применение - выполнение запросов или модификация данных в базе SQLite. Метод применяется после установки соединения с базой данных и создания курсора.

Функция принимает следующие параметры:

  • sql (обязательный) - строка, содержащая SQL-запрос. Может включать заполнители для параметризованных запросов.
  • parameters (опциональный) - параметры для подстановки в SQL-запрос. Может быть последовательностью (для позиционных заполнителей ?) или словарем (для именованных заполнителей :name, @name, $name).

Возвращаемое значение - сам объект курсора, что позволяет использовать цепочку вызовов. Для получения результатов запроса используются методы fetchone, fetchmany или fetchall.

Примеры использования функции

Базовый пример выполнения запроса без параметров:

import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute('CREATE TABLE users (id INTEGER, name TEXT)')
conn.commit()
# Таблица создана

Использование позиционных параметров:

cursor.execute('INSERT INTO users VALUES (?, ?)', (1, 'Алексей'))
conn.commit()
# Данные добавлены

Использование именованных параметров:

cursor.execute('INSERT INTO users VALUES (:id, :name)', {'id': 2, 'name': 'Мария'})
conn.commit()
# Данные добавлены

Выполнение SELECT-запроса с получением данных:

cursor.execute('SELECT * FROM users WHERE id > ?', (0,))
result = cursor.fetchall()
print(result)
[(1, 'Алексей'), (2, 'Мария')]

Альтернативные функции в Python

Модуль sqlite3 предоставляет несколько методов для выполнения SQL-запросов:

  • executemany - выполняет один SQL-запрос для каждой последовательности параметров. Эффективен для массовой вставки данных.
  • executescript - выполняет несколько SQL-запросов, разделенных точкой с запятой. Полезен для выполнения скриптов инициализации.
  • execute с параметром parameters - основной метод для одиночных операций с поддержкой параметризации.

Метод executemany предпочтителен для вставки больших объемов данных, executescript - для выполнения DDL-скриптов, а execute - для большинства других операций.

Аналоги функции в других языках

В JavaScript с использованием библиотеки better-sqlite3:

const db = require('better-sqlite3')('example.db');
const stmt = db.prepare('INSERT INTO users VALUES (?, ?)');
const result = stmt.run(1, 'Алексей');
# Объект с информацией о выполнении

В Java с использованием JDBC:

String sql = "INSERT INTO users VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 1);
pstmt.setString(2, "Алексей");
pstmt.executeUpdate();
# Количество измененных строк

В PHP с использованием PDO:

$stmt = $pdo->prepare("INSERT INTO users VALUES (:id, :name)");
$stmt->execute(['id' => 1, 'name' => 'Алексей']);
# TRUE при успешном выполнении

В Golang с использованием database/sql:

stmt, _ := db.Prepare("INSERT INTO users VALUES(?, ?)")
stmt.Exec(1, "Алексей")
# Результат выполнения и возможная ошибка

Типичные ошибки при использовании

Передача неправильного типа параметров:

cursor.execute('INSERT INTO users VALUES (?, ?)', 1, 'Алексей')
TypeError: function takes at most 2 arguments (3 given)

Использование неправильного количества заполнителей:

cursor.execute('INSERT INTO users VALUES (?, ?)', (1, 'Алексей', 'лишний'))
ProgrammingError: Incorrect number of bindings supplied

Попытка выполнения нескольких запросов через один вызов execute:

cursor.execute('CREATE TABLE t1 (id INT); CREATE TABLE t2 (id INT)')
OperationalError: near "CREATE": syntax error

Отсутствие коммита для изменяющих запросов:

cursor.execute('INSERT INTO users VALUES (?, ?)', (3, 'Иван'))
conn.close()  # данные не сохранятся
# Данные потеряны при закрытии соединения

Изменения в последних версиях

В Python 3.12 была добавлена поддержка параметризованных запросов с заполнителями в стиле $name в дополнение к существующим ? и :name.

В Python 3.10 улучшены сообщения об ошибках при нарушении ограничений внешних ключей.

Начиная с Python 3.8, соединения с SQLite создаются в режиме isolation_level=None по умолчанию, что меняет поведение авто-коммита.

Расширенные примеры использования

Использование пользовательских адаптеров и конвертеров:

Пример python
import sqlite3
import datetime

def adapt_date(date):
    return date.isoformat()

def convert_date(s):
    return datetime.date.fromisoformat(s.decode())

sqlite3.register_adapter(datetime.date, adapt_date)
sqlite3.register_converter("DATE", convert_date)

conn = sqlite3.connect('test.db', detect_types=sqlite3.PARSE_DECLTYPES)
cursor = conn.cursor()
cursor.execute('CREATE TABLE events (id INTEGER, event_date DATE)')
cursor.execute('INSERT INTO events VALUES (?, ?)', (1, datetime.date.today()))
cursor.execute('SELECT * FROM events')
print(cursor.fetchone())
(1, datetime.date(2023, 12, 15))

Использование контекстного менеджера для автоматического коммита:

Пример python
with sqlite3.connect('test.db') as conn:
    cursor = conn.cursor()
    cursor.execute('INSERT INTO users VALUES (?, ?)', (4, 'Ольга'))
    # Автоматический коммит при успешном завершении блока
# Данные сохранены

Работа с транзакциями:

Пример python
conn = sqlite3.connect('test.db')
try:
    cursor = conn.cursor()
    cursor.execute('INSERT INTO users VALUES (?, ?)', (5, 'Петр'))
    cursor.execute('INSERT INTO users VALUES (?, ?)', (6, 'Анна'))
    conn.commit()
except:
    conn.rollback()
# Либо обе операции выполнены, либо ни одной

Использование ROWID для получения идентификатора последней вставленной записи:

Пример python
cursor.execute('INSERT INTO users VALUES (?, ?)', (7, 'Сергей'))
print(cursor.lastrowid)
7

Выполнение запросов с возвращаемыми данными через итератор:

Пример python
cursor.execute('SELECT * FROM users WHERE id > ?', (0,))
for row in cursor:
    print(row)
(1, 'Алексей')
(2, 'Мария')
(3, 'Иван')
(4, 'Ольга')

питон sqlite3.Cursor.execute function comments

En
Sqlite3.Cursor.execute Execute SQL statement