Sqlite3.Cursor.execute: примеры (PYTHON)
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 по умолчанию, что меняет поведение авто-коммита.
Расширенные примеры использования
Использование пользовательских адаптеров и конвертеров:
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))
Использование контекстного менеджера для автоматического коммита:
with sqlite3.connect('test.db') as conn:
cursor = conn.cursor()
cursor.execute('INSERT INTO users VALUES (?, ?)', (4, 'Ольга'))
# Автоматический коммит при успешном завершении блока# Данные сохранены
Работа с транзакциями:
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 для получения идентификатора последней вставленной записи:
cursor.execute('INSERT INTO users VALUES (?, ?)', (7, 'Сергей'))
print(cursor.lastrowid)7
Выполнение запросов с возвращаемыми данными через итератор:
cursor.execute('SELECT * FROM users WHERE id > ?', (0,))
for row in cursor:
print(row)(1, 'Алексей') (2, 'Мария') (3, 'Иван') (4, 'Ольга')
питон sqlite3.Cursor.execute function comments
- питон sqlite3.Cursor.execute - аргументы и возвращаемое значение
- Функция python sqlite3.Cursor.execute - описание
- sqlite3.Cursor.execute - примеры
- sqlite3.Cursor.execute - похожие методы на python
- sqlite3.Cursor.execute на php, c#, sql, java
- sqlite3.Cursor.execute изменения python
- Примеры sqlite3.Cursor.execute на питон