Объекта Cursor
можно получить в результате вызова метода получения курсора connect.cursor()
.
import sqlite3 connect = sqlite3.connect("example.sqlite3") cursor = connect.cursor()
В разделе рассмотрены методы объекта Cursor
модуля sqlite3
с подробным описанием и примерами.
cursor.execute()
,cursor.executemany()
,cursor.executescript()
,cursor.fetchone()
,cursor.fetchmany()
,cursor.fetchall()
,ID
последней измененной строки cursor.lastrowid
,cursor.description
,cursor.rowcount
,cursor.close()
,cursor.fetchmany()
cursor.arraysize
,cursor.connection
,A Cursor instance has the following attributes and methods.
cursor.execute(sql, parameters=(), /)
:Метод cursor.execute()
выполняет команду SQL. Команды SQL могут быть параметризованными, то есть передаются заполнители вместо литералов SQL.
Аргумент parameters
значения Python для привязки к заполнителям в sql
запросе. Представляет собой словарь dict
, если используются именованные заполнители и последовательность, если используются вопросительные знаки '?'
.
Если используются именованные заполнители, а параметры представляют собой последовательность, а не словарь то с версии Python 3.12 выдается
DeprecationWarning
. Начиная с версии Python 3.14, вместо этого будет выдаватьсяProgrammingError
.
Пример использования обоих стилей:
Модуль sqlite3
поддерживает два вида заполнителей: вопросительные знаки '?'
- стиль qmark
и именованные заполнители.
import sqlite3 con = sqlite3.connect(":memory:") cur = con.cursor() sql = "create table people (name_last, age)" cur.execute(sql) who = "Yeltsin" age = 72 # стиль qmark: sql = "insert into people values (?, ?)" cur.execute(sql, (who, age)) # именованный стиль: sql = "select * from people where name_last=:who and age=:age" cur.execute(sql, {"who": who, "age": age}) print(cur.fetchone()) con.close()
Метод cursor.execute()
будет выполнять только один оператор SQL. Если попытаться выполнить более одного оператора, появится предупреждение Warning
. если нужно выполнить несколько операторов SQL одним вызовом то нужно использовать метод cursor.executescript()
.
cursor.executemany(sql, parameters, /)
:Метод cursor.executemany()
выполняет команду sql
для всех элементов последовательности seq_of_parameters
, которые содержат параметры запроса или словари именованных параметров.
Аргумент parameters
- это значения Python для привязки к заполнителям в sql
запросе. Представляет собой словарь dict
, если используются именованные заполнители и последовательность, если используются вопросительные знаки '?'
.
Если используются именованные заполнители, а параметры представляют собой последовательность, а не словарь то с версии Python 3.12 выдается
DeprecationWarning
. Начиная с версии Python 3.14, вместо этого будет выдаватьсяProgrammingError
.
Абстрактный пример:
rows = [ ("row1",), ("row2",), ] cur.executemany("INSERT INTO data VALUES(?)", rows)
Модуль sqlite3 также позволяет использовать итератор, который выдает параметры.
Пример использования итератора:
import sqlite3 class IterChars: def __init__(self): self.count = ord('a') def __iter__(self): return self def __next__(self): if self.count > ord('z'): raise StopIteration self.count += 1 # это кортеж return (chr(self.count - 1),) con = sqlite3.connect(":memory:") cur = con.cursor() cur.execute("create table characters(c)") theIter = IterChars() cur.executemany("insert into characters(c) values (?)", theIter) cur.execute("select c from characters") print(cur.fetchall()) con.close()
Пример использования генератора:
import sqlite3 import string def char_generator(): for c in string.ascii_lowercase: yield (c,) con = sqlite3.connect(":memory:") cur = con.cursor() cur.execute("create table characters(c)") cur.executemany("insert into characters(c) values (?)", char_generator()) cur.execute("select c from characters") print(cur.fetchall()) con.close()
cursor.executescript(sql_script)
:Нестандартный удобный метод cursor.executescript()
для одновременного выполнения нескольких операторов SQL. Аргумент sql_script
может быть экземпляром str
.
Сначала он выдает оператор COMMIT
, а затем выполняет сценарий SQL, полученный в качестве параметра.
Пример использования:
import sqlite3 con = sqlite3.connect(":memory:") cur = con.cursor() cur.executescript(""" create table person( firstname, lastname, age ); create table book( title, author, published ); insert into book(title, author, published) values ( 'Dirk Gently''s Holistic Detective Agency', 'Douglas Adams', 1987 ); """) con.close()
cursor.fetchone()
:Метод cursor.fetchone()
извлекает следующую строку из набора результатов запроса, возвращая одну последовательность или None
, если больше нет доступных данных.
cursor.fetchmany(size=cursor.arraysize)
:Метод cursor.fetchmany()
извлекает следующий набор строк результата запроса, возвращая список. Возвращает пустой список , когда больше нет доступных строк.
Количество строк, извлекаемых за вызов, определяется аргументом size
. Если он не задан, то количество строк, которые нужно извлечь определяет атрибут cursor.arraysize()
.
Метод должен попытаться извлечь столько строк, сколько указано параметром size
. Если это невозможно из-за недоступности указанного количества строк, может быть возвращено меньшее количество строк.
Обратите внимание, что с аргументом size
связаны соображения производительности. Для оптимальной производительности обычно лучше использовать атрибут cursor.arraysize()
. Если используется аргумент size
, то лучше всего сохранить то же значение от одного вызова cursor.fetchmany()
до следующего.
cursor.fetchall()
:Метод cursor.fetchall()
выбирает все оставшиеся строки результата запроса, возвращая список.
Обратите внимание, что атрибут cursor.arraysize()
курсора может повлиять на производительность этой операции. Метод возвращает пустой список, когда нет доступных строк.
cursor.close()
:Метод cursor.close()
закрывает курсор сейчас, а не всякий раз, когда вызывается метод __del__
.
С этого момента курсор будет непригодным для использования. Возникнет исключение ProgrammingError
, если с закрытом курсором будет предпринята какая-либо операция.
cursor.rowcount
:Хотя класс Cursor
модуля sqlite3
реализует атрибут cursor.rowcount
, собственная поддержка ядром SQLite определения "затронутых строк"/"выбранных строк" в запросе является странной.
Для операторов метода cursor.executemany()
количество модификаций суммируется в cursor.rowcount
.
В соответствии со спецификацией API-интерфейса DB Python атрибут cursor.rowcount
равен -1, если для курсора не выполняется любой из методов execute*()
или количество строк последней операции не определяется интерфейсом. Это включает операторы SELECT
, потому что нельзя определить количество строк результата запроса, пока все строки не будут выбраны самим запросом.
В версиях SQLite до 3.6.5 rowcount
устанавливается в 0, если выполнить запрос DELETE FROM table
без каких-либо условий WHERE
.
cursor.lastrowid
:Атрибут cursor.lastrowid
только для чтения, предоставляет идентификатор последней измененной строки в базе данных.
Атрибут cursor.lastrowid
устанавливается только в том случае, если выполняется оператор INSERT
или REPLACE
с помощью метода cursor.execute()
. Для операций, отличных от INSERT
или REPLACE
, или когда вызывается метод cursor.executemany()
, cursor.lastrowid
имеет значение None
.
Атрибут cursor.lastrowid
будет возвращен, если оператору INSERT или REPLACE не удалось успешно вставить предыдущий идентификатор строки.
cursor.arraysize
:Атрибут cursor.arraysize
для чтения и записи. Управляет количеством строк, возвращаемых методом cursor.fetchmany()
.
Значение по умолчанию равно 1, что означает, что для каждого вызова будет выбрана одна строка.
cursor.description
:Атрибут cursor.description
только для чтения. Предоставляет имена столбцов последнего запроса. Чтобы оставаться совместимым с API-интерфейсом Python DB, он возвращает кортеж из 7 элементов для каждого столбца, где последние шесть элементов каждого кортежа равны None
.
Он также устанавливается для операторов SELECT
без соответствующих строк.
cursor.connection
:Атрибут cursor.connection
только для чтения. Обеспечивает соединение базы данных SQLite, используемое объектом Cursor
.
Объект Cursor
, созданный путем вызова connect.cursor()
, будет иметь атрибут подключения, который ссылается на connect:
>>> import sqlite3 >>> connect = sqlite3.connect(":memory:") >>> connect = con.cursor() >>> connect.connection == connect # True