sqlite3 — интерфейс DB-API 2.0 для баз данных SQLite
Исходный код: Lib/sqlite3/
SQLite — это библиотека на языке C, которая предоставляет легковесную дисковую базу данных, не требующую отдельного серверного процесса, и позволяет обращаться к базе данных с помощью нестандартного варианта языка запросов SQL. Некоторые приложения могут использовать SQLite для внутреннего хранения данных. Также можно создать прототип приложения с помощью SQLite, а затем перенести код в более крупную базу данных, например PostgreSQL или Oracle.
Модуль sqlite3 написан Герхардом Херингом. Он предоставляет интерфейс SQL, соответствующий спецификации DB-API 2.0, описанной в PEP 249, и требует стороннюю библиотеку SQLite.
Это необязательный модуль. Если в вашей копии CPython он отсутствует, обратитесь к документации вашего дистрибутива (то есть того, кто предоставил вам Python). Если вы являетесь разработчиком дистрибутива, см. раздел Требования для необязательных модулей.
Этот документ состоит из четырёх основных разделов:
-
Учебное руководство учит использовать модуль
sqlite3. - Справочник описывает классы и функции, определённые в этом модуле.
- Практические руководства подробно описывают выполнение конкретных задач.
- Пояснения содержат подробные сведения об управлении транзакциями.
См. также
- https://www.sqlite.org
-
Веб-страница SQLite; в документации описаны синтаксис и доступные типы данных для поддерживаемого диалекта SQL.
- https://www.w3schools.com/sql/
-
Учебное руководство, справочник и примеры для изучения синтаксиса SQL.
- PEP 249 — спецификация Database API 2.0
-
PEP, написанный Марком-Андре Лембургом.
Учебное руководство
В этом учебном руководстве вы создадите базу данных фильмов «Монти Пайтон», используя основные возможности sqlite3. Предполагается, что вы имеете базовое представление о концепциях баз данных, включая курсоры и транзакции.
Сначала нужно создать новую базу данных и открыть подключение к ней, чтобы sqlite3 мог с ней работать. Вызовите sqlite3.connect(), чтобы создать подключение к базе данных tutorial.db в текущем рабочем каталоге; если базы данных не существует, она будет создана автоматически:
import sqlite3
con = sqlite3.connect("tutorial.db")
Возвращённый объект Connection con представляет подключение к базе данных на диске.
Для выполнения инструкций SQL и получения результатов запросов SQL понадобится курсор базы данных. Вызовите con.cursor(), чтобы создать Cursor:
cur = con.cursor()
Теперь, когда у нас есть подключение к базе данных и курсор, мы можем создать таблицу базы данных movie со столбцами для названия, года выпуска и оценки. Для простоты можно указать только имена столбцов в объявлении таблицы — благодаря функции гибкой типизации SQLite указывать типы данных необязательно. Выполните инструкцию CREATE TABLE, вызвав cur.execute(...):
cur.execute("CREATE TABLE movie(title, year, score)")
Мы можем убедиться, что новая таблица создана, выполнив запрос к встроенной в SQLite таблице sqlite_master, которая теперь должна содержать запись с определением таблицы movie (подробности см. в разделе Таблица схемы). Выполните этот запрос, вызвав cur.execute(...), присвойте результат переменной res и вызовите res.fetchone(), чтобы получить строку результата:
>>> res = cur.execute("SELECT name FROM sqlite_master")
>>> res.fetchone()
('movie',)
Мы видим, что таблица создана: запрос возвращает tuple, содержащий имя таблицы. Если запросить sqlite_master для несуществующей таблицы spam, res.fetchone() вернёт None:
>>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='spam'")
>>> res.fetchone() is None
True
Теперь добавим две строки данных, заданных в виде литералов SQL, выполнив инструкцию INSERT, снова вызвав cur.execute(...):
cur.execute("""
INSERT INTO movie VALUES
('Monty Python and the Holy Grail', 1975, 8.2),
('And Now for Something Completely Different', 1971, 7.5)
""")
Инструкция INSERT неявно открывает транзакцию, которую необходимо зафиксировать, чтобы изменения были сохранены в базе данных (подробности см. в разделе Управление транзакциями). Вызовите con.commit() для объекта подключения, чтобы зафиксировать транзакцию:
con.commit()
Мы можем убедиться, что данные вставлены правильно, выполнив запрос SELECT. Вызовите уже знакомый метод cur.execute(...), чтобы присвоить результат переменной res, и вызовите res.fetchall(), чтобы получить все строки результата:
>>> res = cur.execute("SELECT score FROM movie")
>>> res.fetchall()
[(8.2,), (7.5,)]
Результат представляет собой list из двух объектов tuple, по одному на строку; каждый содержит значение score этой строки.
Теперь вставим ещё три строки, вызвав cur.executemany(...):
data = [
("Monty Python Live at the Hollywood Bowl", 1982, 7.9),
("Monty Python's The Meaning of Life", 1983, 7.5),
("Monty Python's Life of Brian", 1979, 8.0),
]
cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)
con.commit() # Remember to commit the transaction after executing INSERT.
Обратите внимание, что для привязки data к запросу используются заполнители ?. Всегда используйте заполнители вместо форматирования строк для привязки значений Python к инструкциям SQL, чтобы избежать атак с внедрением SQL-кода (подробнее см. в разделе Как использовать заполнители для привязки значений в запросах SQL).
Мы можем убедиться, что новые строки вставлены, выполнив запрос SELECT, на этот раз перебрав результаты запроса:
>>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):
... print(row)
(1971, 'And Now for Something Completely Different')
(1975, 'Monty Python and the Holy Grail')
(1979, "Monty Python's Life of Brian")
(1982, 'Monty Python Live at the Hollywood Bowl')
(1983, "Monty Python's The Meaning of Life")
Каждая строка представляет собой кортеж tuple из двух элементов (year, title), соответствующих столбцам, выбранным в запросе.
Наконец, убедимся, что база данных записана на диск: вызовем con.close(), чтобы закрыть существующее подключение, откроем новое, создадим новый курсор, а затем выполним запрос к базе данных:
>>> con.close()
>>> new_con = sqlite3.connect("tutorial.db")
>>> new_cur = new_con.cursor()
>>> res = new_cur.execute("SELECT title, year FROM movie ORDER BY score DESC")
>>> title, year = res.fetchone()
>>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}')
The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975
>>> new_con.close()
Теперь вы создали базу данных SQLite с помощью модуля sqlite3, вставили в неё данные и несколькими способами получили значения из неё.
См. также
-
Дополнительные материалы в разделе Практические руководства:
- Пояснения содержат подробные сведения об управлении транзакциями.
Справочник
Функции модуля
-
sqlite3.connect(database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=128, uri=False, *, autocommit=sqlite3.LEGACY_TRANSACTION_CONTROL) -
Открывает соединение с базой данных SQLite.
- Параметры:
-
-
database (объект, похожий на путь) – Путь к файлу базы данных, который нужно открыть. Можно передать
":memory:", чтобы создать базу данных SQLite, существующую только в памяти, и открыть к ней соединение. -
timeout (float) – Сколько секунд соединение должно ждать, прежде чем вызвать
OperationalError, если таблица заблокирована. Если другое соединение открывает транзакцию для изменения таблицы, эта таблица будет заблокирована до фиксации транзакции. По умолчанию — пять секунд. -
detect_types (int) – Управляет тем, следует ли искать и каким образом типы данных, не поддерживаемые SQLite изначально, чтобы преобразовать их в типы Python, используя преобразователи, зарегистрированные с помощью
register_converter(). Чтобы включить эту возможность, задайте любое сочетание (с помощью|, побитового ИЛИ) значенийPARSE_DECLTYPESиPARSE_COLNAMES. Если установлены оба флага, имена столбцов имеют приоритет над объявленными типами. По умолчанию (0) определение типов отключено. -
isolation_level (str | None) – Управляет поведением устаревшего механизма обработки транзакций. Дополнительные сведения см. в описании
Connection.isolation_levelи в разделе Управление транзакциями с помощью атрибута isolation_level. Может принимать значения"DEFERRED"(по умолчанию),"EXCLUSIVE"или"IMMEDIATE"; либоNone, чтобы отключить неявное открытие транзакций. Не действует, еслиConnection.autocommitне имеет значенияLEGACY_TRANSACTION_CONTROL(значение по умолчанию). -
check_same_thread (bool) – Если значение равно
True(по умолчанию), при использовании соединения с базой данных потоком, отличным от создавшего его, будет вызвано исключениеProgrammingError. Если значение равноFalse, к соединению могут обращаться несколько потоков; чтобы избежать повреждения данных, пользователю может потребоваться сериализовать операции записи. Дополнительные сведения см. в описанииthreadsafety. -
factory (Connection) – Пользовательский подкласс
Connection, с помощью которого создаётся соединение, если используется не классConnectionпо умолчанию. -
cached_statements (int) – Количество инструкций, которые
sqlite3должен кэшировать внутри для этого соединения, чтобы избежать накладных расходов на разбор. По умолчанию — 128 инструкций. -
uri (bool) – Если задано значение
True, параметр database интерпретируется как URI с путём к файлу и необязательной строкой запроса. Схема должна быть"file:", а путь может быть относительным или абсолютным. Строка запроса позволяет передавать параметры в SQLite, что даёт возможность использовать различные способы работы с URI SQLite. -
autocommit (bool) – Управляет поведением обработки транзакций согласно PEP 249. Дополнительные сведения см. в описании
Connection.autocommitи в разделе Управление транзакциями с помощью атрибута autocommit. В настоящее время значение autocommit по умолчанию —LEGACY_TRANSACTION_CONTROL. В одном из будущих выпусков Python значение по умолчанию изменится наFalse.
-
database (объект, похожий на путь) – Путь к файлу базы данных, который нужно открыть. Можно передать
- Тип возвращаемого значения:
Вызывает событие аудита
sqlite3.connectс аргументомdatabase.Вызывает событие аудита
sqlite3.connect/handleс аргументомconnection_handle.Изменено в версии 3.4: Добавлен параметр uri.
Изменено в версии 3.7: Теперь database может быть также объектом, похожим на путь, а не только строкой.
Изменено в версии 3.10: Добавлено событие аудита
sqlite3.connect/handle.Изменено в версии 3.12: Добавлен параметр autocommit.
Изменено в версии 3.13: Передача параметров timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements и uri позиционно считается устаревшей. В Python 3.15 эти параметры можно будет передавать только по ключевым словам.
-
sqlite3.complete_statement(statement) -
Возвращает
True, если строка statement, по всей видимости, содержит одну или несколько полных инструкций SQL. Синтаксическая проверка или разбор не выполняются; проверяется только отсутствие незакрытых строковых литералов и наличие точки с запятой в конце инструкции.Например:
>>> sqlite3.complete_statement("SELECT foo FROM bar;") True >>> sqlite3.complete_statement("SELECT foo") FalseЭта функция может быть полезна при вводе данных в командной строке, чтобы определить, является ли введённый текст, по всей видимости, полной инструкцией SQL или перед вызовом
execute()требуется дополнительный ввод.Пример использования в реальном приложении см. в
runsource()в файле Lib/sqlite3/__main__.py.
-
sqlite3.enable_callback_tracebacks(flag, /) -
Включает или отключает вывод трассировок в обратных вызовах. По умолчанию трассировки в пользовательских функциях, агрегатах, преобразователях, обратных вызовах авторизатора и т. д. не выводятся. Чтобы отладить их, вызовите эту функцию, задав для flag значение
True. После этого трассировки из обратных вызовов будут выводиться вsys.stderr. ИспользуйтеFalse, чтобы снова отключить эту возможность.Примечание
Ошибки в обратных вызовах пользовательских функций регистрируются как исключения, которые нельзя перехватить. Используйте
unraisable hook handlerдля интроспекции сбойного обратного вызова.
-
sqlite3.register_adapter(type, adapter, /) -
Регистрирует вызываемый объект adapter, преобразующий тип Python type в тип SQLite. Адаптер вызывается с объектом Python типа type в качестве единственного аргумента и должен возвращать значение типа, изначально поддерживаемого SQLite.
-
sqlite3.register_converter(typename, converter, /) -
Регистрирует вызываемый объект converter для преобразования объектов SQLite типа typename в объекты Python заданного типа. Преобразователь вызывается для всех значений SQLite типа typename; ему передаётся объект
bytes, и он должен возвращать объект требуемого типа Python. Сведения о работе определения типов см. в описании параметра detect_types функцииconnect().Примечание. typename и имя типа в запросе сопоставляются без учёта регистра.
Константы модуля
-
sqlite3.LEGACY_TRANSACTION_CONTROL -
Задайте для
autocommitзначение этой константы, чтобы выбрать старый стиль управления транзакциями (до Python 3.12). Дополнительные сведения см. в разделе Управление транзакциями с помощью атрибута isolation_level.
-
sqlite3.PARSE_DECLTYPES -
Передайте это значение флага параметру detect_types функции
connect(), чтобы искать функцию-преобразователь, используя объявленные типы каждого столбца. Типы объявляются при создании таблицы базы данных.sqlite3будет искать функцию-преобразователь, используя первое слово объявленного типа в качестве ключа словаря преобразователей. Например:CREATE TABLE test( i integer primary key, ! will look up a converter named "integer" p point, ! will look up a converter named "point" n number(10) ! will look up a converter named "number" )
Этот флаг можно объединить с
PARSE_COLNAMESс помощью оператора|(побитовое ИЛИ).Примечание
Вычисляемые поля (например,
MAX(p)) возвращаются какstr. ИспользуйтеPARSE_COLNAMES, чтобы задать типы для таких запросов.
-
sqlite3.PARSE_COLNAMES -
Передайте это значение флага параметру detect_types функции
connect(), чтобы искать функцию-преобразователь, используя в качестве ключа словаря преобразователей имя типа, извлечённое из имени столбца запроса. Имя столбца запроса должно быть заключено в двойные кавычки ("), а имя типа — в квадратные скобки ([]).SELECT MAX(p) as "p [point]" FROM test; ! will look up converter "point"
Этот флаг можно объединить с
PARSE_DECLTYPESс помощью оператора|(побитовое ИЛИ).
-
sqlite3.SQLITE_OK -
sqlite3.SQLITE_DENY -
sqlite3.SQLITE_IGNORE -
Флаги, которые должен возвращать вызываемый объект authorizer_callback, переданный в
Connection.set_authorizer(), чтобы указать, что:- Доступ разрешён (
SQLITE_OK); - Инструкцию SQL следует прервать с ошибкой (
SQLITE_DENY); - Столбец следует считать значением
NULL(SQLITE_IGNORE).
- Доступ разрешён (
-
sqlite3.apilevel -
Строковая константа, указывающая поддерживаемый уровень DB-API. Требуется DB-API. Жёстко задана как
"2.0".
-
sqlite3.paramstyle -
Строковая константа, указывающая формат маркеров параметров, ожидаемый модулем
sqlite3. Требуется DB-API. Жёстко задана как"qmark".Примечание
Также поддерживается стиль параметров DB-API
named.
-
sqlite3.sqlite_version -
Номер версии используемой библиотеки SQLite в виде значения типа
string.
-
sqlite3.sqlite_version_info -
Номер версии используемой библиотеки SQLite в виде
tupleиз значений типаintegers.
-
sqlite3.threadsafety -
Целочисленная константа, требуемая DB-API 2.0 и указывающая уровень потокобезопасности, поддерживаемый модулем
sqlite3. Значение этого атрибута определяется режимом многопоточности, с которым скомпилирована базовая библиотека SQLite. Режимы многопоточности SQLite:- Однопоточный: в этом режиме все мьютексы отключены, и SQLite небезопасно использовать одновременно более чем в одном потоке.
- Многопоточный: в этом режиме SQLite можно безопасно использовать в нескольких потоках при условии, что одно и то же соединение с базой данных не используется одновременно в двух или более потоках.
- Сериализованный: в сериализованном режиме SQLite можно безопасно использовать в нескольких потоках без ограничений.
Режим многопоточности SQLite
Значение для DB-API 2.0
однопоточный
0
0
Потоки не могут совместно использовать модуль
многопоточный
1
2
Потоки могут совместно использовать модуль, но не соединения
сериализованный
3
1
Потоки могут совместно использовать модуль, соединения и курсоры
Изменено в версии 3.11: Значение threadsafety теперь задаётся динамически, а не жёстко устанавливается в
1.
-
sqlite3.SQLITE_DBCONFIG_DEFENSIVE -
sqlite3.SQLITE_DBCONFIG_DQS_DDL -
sqlite3.SQLITE_DBCONFIG_DQS_DML -
sqlite3.SQLITE_DBCONFIG_ENABLE_FKEY -
sqlite3.SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER -
sqlite3.SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION -
sqlite3.SQLITE_DBCONFIG_ENABLE_QPSG -
sqlite3.SQLITE_DBCONFIG_ENABLE_TRIGGER -
sqlite3.SQLITE_DBCONFIG_ENABLE_VIEW -
sqlite3.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE -
sqlite3.SQLITE_DBCONFIG_LEGACY_FILE_FORMAT -
sqlite3.SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE -
sqlite3.SQLITE_DBCONFIG_RESET_DATABASE -
sqlite3.SQLITE_DBCONFIG_TRIGGER_EQP -
sqlite3.SQLITE_DBCONFIG_TRUSTED_SCHEMA -
sqlite3.SQLITE_DBCONFIG_WRITABLE_SCHEMA -
Эти константы используются методами
Connection.setconfig()иgetconfig().Доступность этих констант зависит от версии SQLite, с которой был скомпилирован Python.
Добавлено в версии 3.12.
См. также
- https://www.sqlite.org/c3ref/c_dbconfig_defensive.html
-
Документация SQLite: параметры конфигурации соединения с базой данных
Устарело с версии 3.12, удалено в версии 3.14: Константы version и version_info.
Объекты Connection
-
class sqlite3.Connection -
Каждая открытая база данных SQLite представлена объектом
Connection, который создаётся с помощьюsqlite3.connect(). Их основное назначение — создание объектовCursorи управление транзакциями.См. также
Изменено в версии 3.13: Выдаётся предупреждение
ResourceWarning, если методclose()не был вызван до удаления объектаConnection.Подключение к базе данных SQLite имеет следующие атрибуты и методы:
-
cursor(factory=Cursor) -
Создаёт и возвращает объект
Cursor. Метод cursor принимает один необязательный параметр factory. Если он указан, это должен быть вызываемый объект, возвращающий экземплярCursorили его подклассов.
-
blobopen(table, column, rowid, /, *, readonly=False, name='main') -
Открывает дескриптор
Blobдля существующего BLOB.- Параметры:
-
- table (str) – Имя таблицы, в которой находится большой двоичный объект.
- column (str) – Имя столбца, в котором находится большой двоичный объект.
- rowid (int) – Идентификатор строки, в которой находится большой двоичный объект.
-
readonly (bool) – Установите в
True, чтобы открыть большой двоичный объект без разрешения на запись. Значение по умолчанию —False. -
name (str) – Имя базы данных, в которой находится большой двоичный объект. Значение по умолчанию —
"main".
- Вызывает:
-
OperationalError – При попытке открыть большой двоичный объект в таблице
WITHOUT ROWID. - Тип возвращаемого значения:
Примечание
Размер большого двоичного объекта нельзя изменить с помощью класса
Blob. Используйте функцию SQLzeroblob, чтобы создать большой двоичный объект фиксированного размера.Добавлено в версии 3.11.
-
commit() -
Фиксирует все ожидающие транзакции в базе данных. Если
autocommitимеет значениеTrueили открытых транзакций нет, этот метод ничего не делает. Еслиautocommitимеет значениеFalse, после фиксации ожидающей транзакции этим методом неявно открывается новая транзакция.
-
rollback() -
Откатывает все ожидающие транзакции к началу. Если
autocommitимеет значениеTrueили открытых транзакций нет, этот метод ничего не делает. Еслиautocommitимеет значениеFalse, после отката ожидающей транзакции этим методом неявно открывается новая транзакция.
-
close() -
Закрывает подключение к базе данных. Если
autocommitимеет значениеFalse, все ожидающие транзакции неявно откатываются. Еслиautocommitимеет значениеTrueилиLEGACY_TRANSACTION_CONTROL, неявное управление транзакциями не выполняется. Перед закрытием обязательно вызовитеcommit(), чтобы не потерять ожидающие изменения.
-
execute(sql, parameters=(), /) -
Создаёт новый объект
Cursorи вызывает для негоexecute()с указанными значениями sql и parameters. Возвращает новый объект курсора.
-
executemany(sql, parameters, /) -
Создаёт новый объект
Cursorи вызывает для негоexecutemany()с указанными значениями sql и parameters. Возвращает новый объект курсора.
-
executescript(sql_script, /) -
Создаёт новый объект
Cursorи вызывает для негоexecutescript()с указанным значением sql_script. Возвращает новый объект курсора.
-
create_function(name, narg, func, *, deterministic=False) -
Создаёт или удаляет пользовательскую функцию SQL.
- Параметры:
-
- name (str) – Имя функции SQL.
-
narg (int) – Количество аргументов, которые может принимать функция SQL. Если задано
-1, она может принимать любое количество аргументов. -
func (функция обратного вызова | None) – Вызываемый объект, который вызывается при вызове функции SQL. Вызываемый объект должен возвращать тип, изначально поддерживаемый SQLite. Установите значение
None, чтобы удалить существующую функцию SQL. -
deterministic (bool) – Если значение равно
True, созданная функция SQL помечается как детерминированная, что позволяет SQLite выполнять дополнительные оптимизации.
Изменено в версии 3.8: Добавлен параметр deterministic.
Пример:
>>> import hashlib >>> def md5sum(t): ... return hashlib.md5(t).hexdigest() >>> con = sqlite3.connect(":memory:") >>> con.create_function("md5", 1, md5sum) >>> for row in con.execute("SELECT md5(?)", (b"foo",)): ... print(row) ('acbd18db4cc2f85cedef654fccc4a4d8',) >>> con.close()Изменено в версии 3.13: Передача name, narg и func в виде ключевых аргументов устарела. В Python 3.15 эти параметры будут доступны только как позиционные.
-
create_aggregate(name, n_arg, aggregate_class) -
Создаёт или удаляет пользовательскую агрегатную функцию SQL.
- Параметры:
-
- name (str) – Имя агрегатной функции SQL.
-
n_arg (int) – Количество аргументов, которые может принимать агрегатная функция SQL. Если задано
-1, она может принимать любое количество аргументов. -
aggregate_class (класс | None) –
Класс должен реализовывать следующие методы:
-
step(): Добавляет строку в агрегат. -
finalize(): Возвращает итоговый результат агрегата как тип, изначально поддерживаемый SQLite.
Количество аргументов, которые должен принимать метод
step(), определяется параметром n_arg.Установите значение
None, чтобы удалить существующую агрегатную функцию SQL. -
Пример:
class MySum: def __init__(self): self.count = 0 def step(self, value): self.count += value def finalize(self): return self.count con = sqlite3.connect(":memory:") con.create_aggregate("mysum", 1, MySum) cur = con.execute("CREATE TABLE test(i)") cur.execute("INSERT INTO test(i) VALUES(1)") cur.execute("INSERT INTO test(i) VALUES(2)") cur.execute("SELECT mysum(i) FROM test") print(cur.fetchone()[0]) con.close()Изменено в версии 3.13: Передача name, n_arg и aggregate_class в виде ключевых аргументов устарела. В Python 3.15 эти параметры будут доступны только как позиционные.
-
create_window_function(name, num_params, aggregate_class, /) -
Создаёт или удаляет пользовательскую агрегатную оконную функцию.
- Параметры:
-
- name (str) – Имя агрегатной оконной функции SQL, которую нужно создать или удалить.
-
num_params (int) – Количество аргументов, которые может принимать агрегатная оконная функция SQL. Если задано
-1, она может принимать любое количество аргументов. -
aggregate_class (класс | None) –
Класс должен реализовывать следующие методы:
-
step(): Добавляет строку в текущее окно. -
value(): Возвращает текущее значение агрегата. -
inverse(): Удаляет строку из текущего окна. -
finalize(): Возвращает итоговый результат агрегата как тип, изначально поддерживаемый SQLite.
Количество аргументов, которые должны принимать методы
step()иvalue(), определяется параметром num_params.Установите значение
None, чтобы удалить существующую агрегатную оконную функцию SQL. -
- Вызывает:
-
NotSupportedError – Если метод используется с версией SQLite старше 3.25.0, которая не поддерживает агрегатные оконные функции.
Добавлено в версии 3.11.
Пример:
# Example taken from https://www.sqlite.org/windowfunctions.html#udfwinfunc class WindowSumInt: def __init__(self): self.count = 0 def step(self, value): """Add a row to the current window.""" self.count += value def value(self): """Return the current value of the aggregate.""" return self.count def inverse(self, value): """Remove a row from the current window.""" self.count -= value def finalize(self): """Return the final value of the aggregate. Any clean-up actions should be placed here. """ return self.count con = sqlite3.connect(":memory:") cur = con.execute("CREATE TABLE test(x, y)") values = [ ("a", 4), ("b", 5), ("c", 3), ("d", 8), ("e", 1), ] cur.executemany("INSERT INTO test VALUES(?, ?)", values) con.create_window_function("sumint", 1, WindowSumInt) cur.execute(""" SELECT x, sumint(y) OVER ( ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS sum_y FROM test ORDER BY x """) print(cur.fetchall()) con.close()
-
create_collation(name, callable, /) -
Создаёт правило сортировки с именем name, используя функцию сортировки callable. В callable передаются два аргумента типа
string; функция должна возвращатьinteger:-
1, если первый элемент упорядочен выше второго -
-1, если первый элемент упорядочен ниже второго -
0, если элементы упорядочены одинаково
В следующем примере показано правило сортировки в обратном порядке:
def collate_reverse(string1, string2): if string1 == string2: return 0 elif string1 < string2: return 1 else: return -1 con = sqlite3.connect(":memory:") con.create_collation("reverse", collate_reverse) cur = con.execute("CREATE TABLE test(x)") cur.executemany("INSERT INTO test(x) VALUES(?)", [("a",), ("b",)]) cur.execute("SELECT x FROM test ORDER BY x COLLATE reverse") for row in cur: print(row) con.close()Чтобы удалить функцию сортировки, задайте для callable значение
None.Изменено в версии 3.11: Имя правила сортировки может содержать любые символы Unicode. Ранее допускались только символы ASCII.
-
-
interrupt() -
Вызовите этот метод из другого потока, чтобы прервать любые запросы, выполняющиеся в подключении. Прерванные запросы вызовут исключение
OperationalError.
-
set_authorizer(authorizer_callback) -
Зарегистрируйте вызываемый объект authorizer_callback, который будет вызываться при каждой попытке доступа к столбцу таблицы в базе данных. Функция обратного вызова должна возвращать одно из значений
SQLITE_OK,SQLITE_DENYилиSQLITE_IGNORE, чтобы указать базовой библиотеке SQLite, как обрабатывать доступ к столбцу.Первый аргумент функции обратного вызова указывает, какую операцию нужно авторизовать. Второй и третий аргументы будут содержать аргументы или
Noneв зависимости от первого аргумента. Четвёртый аргумент — имя базы данных («main», «temp» и т. д.), если оно применимо. Пятый аргумент — имя самого внутреннего триггера или представления, отвечающего за попытку доступа, либоNone, если попытка доступа осуществляется непосредственно из входного кода SQL.Сведения о возможных значениях первого аргумента и значении второго и третьего аргументов в зависимости от первого приведены в документации SQLite. Все необходимые константы доступны в модуле
sqlite3.Передача
Noneв качестве authorizer_callback отключит авторизатор.Изменено в версии 3.11: Добавлена возможность отключать авторизатор с помощью
None.Изменено в версии 3.13: Передача authorizer_callback в виде ключевого аргумента устарела. В Python 3.15 этот параметр будет доступен только как позиционный.
-
set_progress_handler(progress_handler, n) -
Зарегистрируйте вызываемый объект progress_handler, который будет вызываться через каждые n инструкций виртуальной машины SQLite. Это полезно, если нужно получать вызовы из SQLite во время длительных операций, например для обновления графического интерфейса.
Чтобы удалить ранее установленный обработчик хода выполнения, вызовите этот метод, передав
Noneв качестве progress_handler.Возврат ненулевого значения из функции-обработчика завершит выполняющийся запрос и приведёт к возникновению исключения
DatabaseError.Изменено в версии 3.13: Передача progress_handler в виде ключевого аргумента устарела. В Python 3.15 этот параметр будет доступен только как позиционный.
-
set_trace_callback(trace_callback) -
Зарегистрируйте вызываемый объект trace_callback, который будет вызываться для каждого оператора SQL, фактически выполняемого серверной частью SQLite.
Единственный аргумент, передаваемый функции обратного вызова, — выполняемый оператор (типа
str). Возвращаемое значение функции обратного вызова игнорируется. Обратите внимание, что серверная часть выполняет не только операторы, переданные методамCursor.execute(). К другим источникам относятся управление транзакциями модуляsqlite3и выполнение триггеров, определённых в текущей базе данных.Передача
Noneв качестве trace_callback отключит функцию обратного вызова трассировки.Примечание
Исключения, возникающие в функции обратного вызова трассировки, не передаются вызывающему коду. Для разработки и отладки используйте
enable_callback_tracebacks(), чтобы включить вывод трассировок стека исключений, возникающих в функции обратного вызова трассировки.Добавлено в версии 3.3.
Изменено в версии 3.13: Передача trace_callback в виде ключевого аргумента устарела. В Python 3.15 этот параметр будет доступен только как позиционный.
-
enable_load_extension(enabled, /) -
Разрешает ядру SQLite загружать расширения SQLite из общих библиотек, если параметр enabled имеет значение
True; в противном случае загрузка расширений SQLite запрещается. Расширения SQLite могут определять новые функции, агрегаты или реализации целых виртуальных таблиц. Одним из известных расширений является расширение полнотекстового поиска, распространяемое вместе с SQLite.Примечание
Модуль
sqlite3по умолчанию собирается без поддержки загружаемых расширений, поскольку в некоторых системах (в частности, в macOS) используются библиотеки SQLite, скомпилированные без этой возможности. Чтобы включить поддержку загружаемых расширений, необходимо передать параметр--enable-loadable-sqlite-extensionsкоманде configure.Вызывает событие аудита
sqlite3.enable_load_extensionс аргументамиconnection,enabled.Добавлено в версии 3.2.
Изменено в версии 3.10: Добавлено событие аудита
sqlite3.enable_load_extension.con.enable_load_extension(True) # Load the fulltext search extension con.execute("select load_extension('./fts3.so')") # alternatively you can load the extension using an API call: # con.load_extension("./fts3.so") # disable extension loading again con.enable_load_extension(False) # example from SQLite wiki con.execute("CREATE VIRTUAL TABLE recipe USING fts3(name, ingredients)") con.executescript(""" INSERT INTO recipe (name, ingredients) VALUES('broccoli stew', 'broccoli peppers cheese tomatoes'); INSERT INTO recipe (name, ingredients) VALUES('pumpkin stew', 'pumpkin onions garlic celery'); INSERT INTO recipe (name, ingredients) VALUES('broccoli pie', 'broccoli cheese onions flour'); INSERT INTO recipe (name, ingredients) VALUES('pumpkin pie', 'pumpkin sugar flour butter'); """) for row in con.execute("SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'"): print(row)
-
load_extension(path, /, *, entrypoint=None) -
Загружает расширение SQLite из общей библиотеки. Перед вызовом этого метода включите загрузку расширений с помощью
enable_load_extension().- Параметры:
-
- path (str) – Путь к расширению SQLite.
-
entrypoint (str | None) – Имя точки входа. Если задано
None(значение по умолчанию), SQLite самостоятельно выберет имя точки входа; подробности см. в документации SQLite в разделе Загрузка расширения.
Вызывает событие аудита
sqlite3.load_extensionс аргументамиconnection,path.Добавлено в версии 3.2.
Изменено в версии 3.10: Добавлено событие аудита
sqlite3.load_extension.Изменено в версии 3.12: Добавлен параметр entrypoint.
-
iterdump(*, filter=None) -
Возвращает итератор для выгрузки базы данных в виде исходного кода SQL. Полезно для сохранения базы данных в памяти, чтобы восстановить её позднее. Аналог команды
.dumpв оболочке sqlite3.- Параметры:
-
filter (str | None) – Необязательный шаблон
LIKEдля объектов базы данных, которые нужно выгрузить, напримерprefix_%. Если заданоNone(значение по умолчанию), будут включены все объекты базы данных.
Пример:
# Convert file example.db to SQL dump file dump.sql con = sqlite3.connect('example.db') with open('dump.sql', 'w') as f: for line in con.iterdump(): f.write('%s\n' % line) con.close()Изменено в версии 3.13: Добавлен параметр filter.
-
backup(target, *, pages=-1, progress=None, name='main', sleep=0.250) -
Создаёт резервную копию базы данных SQLite.
Работает, даже если база данных используется другими клиентами или одновременно тем же подключением.
- Параметры:
-
- target (Connection) – Подключение к базе данных, в которую нужно сохранить резервную копию.
-
pages (int) – Количество страниц, копируемых за один раз. Если значение меньше или равно
0, вся база данных копируется за один шаг. Значение по умолчанию —-1. -
progress (функция обратного вызова | None) – Если задан вызываемый объект, он вызывается на каждой итерации резервного копирования с тремя целочисленными аргументами: status последней итерации, remaining — количество оставшихся для копирования страниц и total — общее количество страниц. Значение по умолчанию —
None. -
name (str) – Имя базы данных, для которой создаётся резервная копия. Это может быть
"main"(значение по умолчанию) для основной базы данных,"temp"для временной базы данных или имя пользовательской базы данных, подключённой с помощью оператора SQLATTACH DATABASE. - sleep (float) – Количество секунд ожидания между последовательными попытками скопировать оставшиеся страницы.
Пример 1: копирование существующей базы данных в другую:
def progress(status, remaining, total): print(f'Copied {total-remaining} of {total} pages...') src = sqlite3.connect('example.db') dst = sqlite3.connect('backup.db') with dst: src.backup(dst, pages=1, progress=progress) dst.close() src.close()Пример 2: копирование существующей базы данных во временную копию:
src = sqlite3.connect('example.db') dst = sqlite3.connect(':memory:') src.backup(dst) dst.close() src.close()Добавлено в версии 3.7.
-
getlimit(category, /) -
Получает ограничение времени выполнения для подключения.
- Параметры:
-
category (int) – Категория ограничений SQLite, значение которой нужно получить.
- Тип возвращаемого значения:
- Вызывает:
-
ProgrammingError – Если базовая библиотека SQLite не распознаёт category.
Пример: получить максимальную длину оператора SQL для
Connectioncon(значение по умолчанию — 1000000000):>>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH) 1000000000
Добавлено в версии 3.11.
-
setlimit(category, limit, /) -
Устанавливает ограничение времени выполнения для подключения. Попытки увеличить ограничение выше его жёсткого верхнего предела будут без предупреждения ограничены этим пределом. Независимо от того, изменилось ли ограничение, возвращается его предыдущее значение.
- Параметры:
-
- category (int) – Категория ограничений SQLite, для которой устанавливается значение.
- limit (int) – Новое значение ограничения. Если значение отрицательное, текущее ограничение не изменяется.
- Тип возвращаемого значения:
- Вызывает:
-
ProgrammingError – Если базовая библиотека SQLite не распознаёт category.
Пример: ограничить количество подключённых баз данных значением 1 для
Connectioncon(ограничение по умолчанию — 10):>>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1) 10 >>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED) 1
Добавлено в версии 3.11.
-
getconfig(op, /) -
Запрашивает логический параметр конфигурации подключения.
- Параметры:
-
op (int) – Код SQLITE_DBCONFIG.
- Тип возвращаемого значения:
Добавлено в версии 3.12.
-
-
setconfig(op, enable=True, /) -
Задать логический параметр конфигурации соединения.
- Параметры:
-
- op (int) – Код SQLITE_DBCONFIG.
-
enable (bool) –
True, если параметр конфигурации следует включить (по умолчанию);False, если его следует отключить.
Добавлено в версии 3.12.
-
serialize(*, name='main') -
Сериализовать базу данных в объект
bytes. Для обычного файла базы данных на диске сериализация представляет собой копию файла. Для базы данных в памяти или «временной» базы данных сериализация представляет собой ту же последовательность байтов, которая была бы записана на диск при резервном копировании этой базы данных.- Параметры:
-
name (str) – Имя сериализуемой базы данных. По умолчанию —
"main". - Тип возвращаемого значения:
Примечание
Этот метод доступен только в том случае, если в используемой библиотеке SQLite есть API сериализации.
Добавлено в версии 3.11.
-
deserialize(data, /, *, name='main') -
Десериализовать базу данных
serializedвConnection. Этот метод отключает соединение с базой данных name и повторно открывает name как базу данных в памяти на основе сериализованных данных, содержащихся в data.- Параметры:
- Вызывает исключения:
-
- OperationalError – Если соединение с базой данных в данный момент участвует в транзакции чтения или операции резервного копирования.
- DatabaseError – Если data не содержит допустимую базу данных SQLite.
-
OverflowError – Если
len(data)больше2**63 - 1.
Примечание
Этот метод доступен только в том случае, если в используемой библиотеке SQLite есть API десериализации.
Добавлено в версии 3.11.
-
autocommit -
Этот атрибут управляет поведением транзакций, соответствующим PEP 249.
autocommitможет принимать три допустимых значения:-
False: выбрать поведение транзакций, соответствующее PEP 249; это означает, чтоsqlite3гарантирует, что транзакция всегда открыта. Используйтеcommit()иrollback(), чтобы закрыть транзакции.Это рекомендуемое значение для
autocommit. -
True: использовать режим автокоммита SQLite. В этом режимеcommit()иrollback()не оказывают никакого эффекта. -
LEGACY_TRANSACTION_CONTROL: управление транзакциями, использовавшееся до Python 3.12 (не соответствующее PEP 249). Подробнее см.isolation_level.В настоящее время это значение по умолчанию для
autocommit.
Изменение
autocommitнаFalseоткроет новую транзакцию, а изменение наTrueзафиксирует все ожидающие транзакции.Подробнее см. Управление транзакциями с помощью атрибута autocommit.
Примечание
Атрибут
isolation_levelне оказывает эффекта, еслиautocommitне равенLEGACY_TRANSACTION_CONTROL.Добавлено в версии 3.12.
-
-
in_transaction -
Этот атрибут только для чтения соответствует низкоуровневому режиму автокоммита SQLite.
True, если транзакция активна (есть незафиксированные изменения), иначе —False.Добавлено в версии 3.2.
-
isolation_level -
Управляет режимом обработки транзакций для обратной совместимости объекта
sqlite3. Если установлено значениеNone, транзакции никогда не открываются неявно. Если установлено одно из значений"DEFERRED","IMMEDIATE"или"EXCLUSIVE", соответствующих поведению транзакций SQLite, выполняется неявное управление транзакциями.Если значение не переопределено параметром isolation_level функции
connect(), по умолчанию используется"", являющееся псевдонимом"DEFERRED".Примечание
Для управления обработкой транзакций рекомендуется использовать
autocommit, а неisolation_level.isolation_levelне оказывает эффекта, еслиautocommitне установлен вLEGACY_TRANSACTION_CONTROL(значение по умолчанию).
-
row_factory -
Исходное значение
row_factoryдля объектовCursor, созданных на основе этого соединения. Присваивание этому атрибуту не влияет наrow_factoryсуществующих курсоров, принадлежащих этому соединению, — только новых. По умолчанию установлено значениеNone, то есть каждая строка возвращается какtuple.Подробнее см. Как создавать и использовать фабрики строк.
Изменено в версии 3.14.6: Удаление атрибута
row_factoryбольше не допускается.
-
text_factory -
Вызываемый объект, который принимает параметр
bytesи возвращает его текстовое представление. Вызываемый объект применяется к значениям SQLite с типом данныхTEXT. По умолчанию этому атрибуту присваивается значениеstr.Подробнее см. Как обрабатывать текстовые кодировки, отличные от UTF-8.
Изменено в версии 3.14.6: Удаление атрибута
text_factoryбольше не допускается.
-
total_changes -
Возвращает общее количество строк базы данных, изменённых, вставленных или удалённых с момента открытия соединения с базой данных.
-
Объекты курсора
Объект Cursor представляет собой курсор базы данных, который используется для выполнения инструкций SQL и управления контекстом операции извлечения данных. Курсоры создаются с помощью Connection.cursor() или любого из сокращённых методов соединения.
Объекты курсора являются итераторами: это означает, что если выполнить запрос SELECT с помощью execute(), можно просто пройтись по курсору, чтобы получить результирующие строки:
for row in cur.execute("SELECT t FROM data"):
print(row)
-
class sqlite3.Cursor -
Экземпляр
Cursorимеет следующие атрибуты и методы.-
execute(sql, parameters=(), /) -
Выполнить одну инструкцию SQL, при необходимости привязав значения Python с помощью заполнителей.
- Параметры:
-
- sql (str) – Одна инструкция SQL.
-
parameters (
dict| последовательность) – Значения Python, привязываемые к заполнителям в sql. Значениеdict, если используются именованные заполнители. Последовательность, если используются неименованные заполнители. См. раздел Как использовать заполнители для привязки значений в SQL-запросах.
- Вызывает исключения:
-
ProgrammingError – Если sql содержит более одной инструкции SQL. Если используются именованные заполнители, а parameters является последовательностью, а не
dict.
Если
autocommitимеет значениеLEGACY_TRANSACTION_CONTROL,isolation_levelне равноNone, sql является инструкциейINSERT,UPDATE,DELETEилиREPLACE, а открытой транзакции нет, перед выполнением sql неявно открывается транзакция.Изменено в версии 3.14: Возникает исключение
ProgrammingError, если используются именованные заполнители, а parameters является последовательностью, а неdict.Для выполнения нескольких инструкций SQL используйте
executescript().
-
executemany(sql, parameters, /) -
Для каждого элемента в parameters повторно выполнить параметризованную инструкцию SQL DML sql, используя параметры.
Использует ту же обработку неявных транзакций, что и
execute().- Параметры:
-
- sql (str) – Одна инструкция DML SQL.
- parameters (итерируемый объект) – Итерируемый объект с параметрами, которые привязываются к заполнителям в sql. См. раздел Как использовать заполнители для привязки значений в SQL-запросах.
- Вызывает исключения:
-
ProgrammingError – Если sql содержит более одной инструкции SQL или не является инструкцией DML; если используются именованные заполнители, а элементы в parameters являются последовательностями, а не
dict.
Пример:
rows = [ ("row1",), ("row2",), ] # cur is an sqlite3.Cursor object cur.executemany("INSERT INTO data VALUES(?)", rows)Примечание
Все результирующие строки отбрасываются, включая строки инструкций DML с предложениями RETURNING.
Изменено в версии 3.14: Возникает исключение
ProgrammingError, если используются именованные заполнители, а элементы в parameters являются последовательностями, а неdict.
-
executescript(sql_script, /) -
Выполнить инструкции SQL из sql_script. Если
autocommitимеет значениеLEGACY_TRANSACTION_CONTROLи есть ожидающая транзакция, сначала неявно выполняется инструкцияCOMMIT. Другое неявное управление транзакциями не выполняется; все инструкции управления транзакциями необходимо добавить в sql_script.sql_script должен быть объектом
string.Пример:
# cur is an sqlite3.Cursor object cur.executescript(""" BEGIN; CREATE TABLE person(firstname, lastname, age); CREATE TABLE book(title, author, published); CREATE TABLE publisher(name, address); COMMIT; """)
-
fetchone() -
Если
row_factoryравноNone, вернуть следующую строку результата запроса какtuple. В противном случае передать её фабрике строк и вернуть полученный результат. Если данных больше нет, вернутьNone.
-
fetchmany(size=cursor.arraysize) -
Вернуть следующий набор строк результата запроса в виде
list. Если строк больше нет, вернуть пустой список.Количество извлекаемых за один вызов строк задаётся параметром size. Если size не указан, количество извлекаемых строк определяется атрибутом
arraysize. Если доступно меньше строк, чем указано в size, возвращаются все доступные строки.Обратите внимание, что параметр size влияет на производительность. Для оптимальной производительности обычно лучше использовать атрибут arraysize. Если используется параметр size, лучше сохранять его значение неизменным от одного вызова
fetchmany()к следующему.Изменено в версии 3.14.1: Отрицательные значения size отклоняются с возбуждением исключения
ValueError.
-
fetchall() -
Вернуть все оставшиеся строки результата запроса в виде
list. Если строк нет, вернуть пустой список. Обратите внимание, что атрибутarraysizeможет влиять на производительность этой операции.
-
close() -
Немедленно закрыть курсор (а не дожидаться вызова
__del__).С этого момента курсор нельзя будет использовать; при попытке выполнить с ним какую-либо операцию будет возбуждено исключение
ProgrammingError.
-
setinputsizes(sizes, /) -
Требуется DB-API. В
sqlite3ничего не делает.
-
setoutputsize(size, column=None, /) -
Требуется DB-API. В
sqlite3ничего не делает.
-
arraysize -
Атрибут для чтения и записи, управляющий количеством строк, возвращаемых методом
fetchmany(). Значение по умолчанию — 1, то есть за один вызов извлекается одна строка.Изменено в версии 3.14.1: Отрицательные значения отклоняются с возбуждением исключения
ValueError.
-
connection -
Атрибут только для чтения, предоставляющий
Connectionбазы данных SQLite, к которому относится курсор. ОбъектCursor, созданный вызовомcon.cursor(), имеет атрибутconnection, ссылающийся на con:>>> con = sqlite3.connect(":memory:") >>> cur = con.cursor() >>> cur.connection == con True >>> con.close()
-
description -
Атрибут только для чтения, предоставляющий имена столбцов последнего запроса. Для совместимости с Python DB API он возвращает 7-элементный кортеж для каждого столбца, где последние шесть элементов каждого кортежа имеют значение
None.Он также задаётся для инструкций
SELECT, не возвращающих совпадающих строк.
-
lastrowid -
Атрибут только для чтения, предоставляющий идентификатор последней вставленной строки. Он обновляется только после успешного выполнения инструкций
INSERTилиREPLACEс помощью методаexecute(). Для других инструкций, после вызоваexecutemany()илиexecutescript(), а также при неудачной вставке значениеlastrowidостаётся неизменным. Начальное значениеlastrowid—None.Примечание
Вставки в таблицы
WITHOUT ROWIDне регистрируются.Изменено в версии 3.6: Добавлена поддержка инструкции
REPLACE.
-
rowcount -
Атрибут только для чтения, предоставляющий количество изменённых строк для инструкций
INSERT,UPDATE,DELETEиREPLACE; для других инструкций, включая запросы CTE, его значение равно-1. Он обновляется только методамиexecute()иexecutemany(), после полного выполнения инструкции. Это означает, что для обновленияrowcountнеобходимо извлечь все результирующие строки.
-
row_factory -
Определяет, как представляется строка, извлечённая из этого
Cursor. Если значение равноNone, строка представляется в видеtuple. Можно задать включённыйsqlite3.Rowили вызываемый объект, принимающий два аргумента: объектCursorиtupleзначений строки; он возвращает пользовательский объект, представляющий строку SQLite.По умолчанию используется значение, заданное для
Connection.row_factoryна момент созданияCursor. Присваивание этому атрибуту не влияет наConnection.row_factoryродительского соединения.Подробнее см. Как создавать и использовать фабрики строк.
Изменено в версии 3.14.6: Удаление атрибута
row_factoryбольше не допускается.
-
Объекты строк
-
class sqlite3.Row -
Экземпляр
Rowслужит высокооптимизированной фабрикой строкrow_factoryдля объектовConnection. Он поддерживает итерацию, проверку на равенство,len()и доступ в качестве отображения по имени или индексу столбца.Два объекта
Rowсчитаются равными, если у них совпадают имена столбцов и значения.Подробнее см. Как создавать и использовать фабрики строк.
-
keys() -
Возвращает
listимён столбцов в виде объектовstrings. Сразу после запроса это первые элементы каждого кортежа вCursor.description.
Изменено в версии 3.5: Добавлена поддержка срезов.
-
Объекты Blob
-
class sqlite3.Blob -
Добавлено в версии 3.11.
Экземпляр
Blob— это файлоподобный объект, который может читать и записывать данные в SQLite BLOB. Вызовитеlen(blob), чтобы получить размер (количество байтов) blob-объекта. Используйте индексы и срезы для прямого доступа к данным blob-объекта.Используйте
Blobкак менеджер контекста, чтобы гарантировать закрытие дескриптора blob-объекта после использования.con = sqlite3.connect(":memory:") con.execute("CREATE TABLE test(blob_col blob)") con.execute("INSERT INTO test(blob_col) VALUES(zeroblob(13))") # Write to our blob, using two write operations: with con.blobopen("test", "blob_col", 1) as blob: blob.write(b"hello, ") blob.write(b"world.") # Modify the first and last bytes of our blob blob[0] = ord("H") blob[-1] = ord("!") # Read the contents of our blob with con.blobopen("test", "blob_col", 1) as blob: greeting = blob.read() print(greeting) # outputs "b'Hello, world!'" con.close()-
close() -
Закрывает blob-объект.
С этого момента blob-объект нельзя будет использовать. При любой дальнейшей попытке выполнить с ним операцию будет возбуждено исключение
Error(или его подкласса).
-
read(length=-1, /) -
Читает length байтов данных из blob-объекта, начиная с текущей позиции смещения. Если достигнут конец blob-объекта, будут возвращены данные до EOF. Если length не задан или отрицателен,
read()будет читать до конца blob-объекта.
-
write(data, /) -
Записывает data в blob-объект, начиная с текущего смещения. Эта функция не может изменить длину blob-объекта. Попытка записи за пределами конца blob-объекта вызовет исключение
ValueError.
-
tell() -
Возвращает текущую позицию доступа к blob-объекту.
-
seek(offset, origin=os.SEEK_SET, /) -
Устанавливает текущую позицию доступа к blob-объекту равной offset. Аргумент origin по умолчанию равен
os.SEEK_SET(абсолютное позиционирование в blob-объекте). Другие значения origin:os.SEEK_CUR(смещение относительно текущей позиции) иos.SEEK_END(смещение относительно конца blob-объекта).
-
Объекты PrepareProtocol
-
class sqlite3.PrepareProtocol -
Единственное назначение типа PrepareProtocol — служить протоколом адаптации в стиле PEP 246 для объектов, которые могут адаптировать себя к встроенным типам SQLite.
Исключения
Иерархия исключений определена в DB-API 2.0 (PEP 249).
-
exception sqlite3.Warning -
В настоящее время это исключение не возбуждается модулем
sqlite3, но его могут возбуждать приложения, использующиеsqlite3, например, если определённая пользователем функция усекает данные при вставке.Warning— подклассException.
-
exception sqlite3.Error -
Базовый класс остальных исключений этого модуля. Используйте его, чтобы перехватывать все ошибки одним оператором
except.Error— подклассException.Если исключение возникло внутри библиотеки SQLite, к нему добавляются следующие два атрибута:
-
sqlite_errorcode -
Числовой код ошибки из API SQLite
Добавлено в версии 3.11.
-
sqlite_errorname -
Символьное имя числового кода ошибки из API SQLite
Добавлено в версии 3.11.
-
-
exception sqlite3.InterfaceError -
Исключение, возбуждаемое при неправильном использовании низкоуровневого API SQLite на языке C. Иными словами, если возбуждено это исключение, вероятно, это указывает на ошибку в модуле
sqlite3.InterfaceError— подклассError.
-
exception sqlite3.DatabaseError -
Исключение, возбуждаемое при ошибках, связанных с базой данных. Оно служит базовым исключением для нескольких типов ошибок базы данных. Оно возбуждается только неявно через специализированные подклассы.
DatabaseError— подклассError.
-
exception sqlite3.DataError -
Исключение, возбуждаемое при ошибках, вызванных проблемами с обрабатываемыми данными, например выходом числовых значений за допустимый диапазон или слишком длинными строками.
DataError— подклассDatabaseError.
-
exception sqlite3.OperationalError -
Исключение, возбуждаемое при ошибках, связанных с работой базы данных и не обязательно зависящих от программиста. Например, путь к базе данных не найден или транзакцию не удалось обработать.
OperationalError— подклассDatabaseError.
-
exception sqlite3.IntegrityError -
Исключение, возбуждаемое при нарушении реляционной целостности базы данных, например при сбое проверки внешнего ключа. Это подкласс
DatabaseError.
-
exception sqlite3.InternalError -
Исключение, возбуждаемое при обнаружении SQLite внутренней ошибки. Его возникновение может указывать на проблему с используемой библиотекой SQLite.
InternalError— подклассDatabaseError.
-
exception sqlite3.ProgrammingError -
Исключение, возбуждаемое при ошибках программирования при работе с API
sqlite3, например при передаче неверного количества привязок запросу или попытке выполнить операцию с закрытым объектомConnection.ProgrammingError— подклассDatabaseError.
-
exception sqlite3.NotSupportedError -
Исключение, возбуждаемое, если метод или API базы данных не поддерживается используемой библиотекой SQLite. Например, установка значения
Trueдля параметра deterministic вcreate_function(), если используемая библиотека SQLite не поддерживает детерминированные функции.NotSupportedError— подклассDatabaseError.
Типы SQLite и Python
SQLite изначально поддерживает следующие типы: NULL, INTEGER, REAL, TEXT, BLOB.
Поэтому следующие типы Python можно без проблем передавать в SQLite:
Тип Python | Тип SQLite |
|---|---|
|
|
| |
| |
| |
|
По умолчанию типы SQLite преобразуются в типы Python следующим образом:
Тип SQLite | Тип Python |
|---|---|
|
|
| |
| |
| зависит от |
|
Систему типов модуля sqlite3 можно расширить двумя способами: хранить дополнительные типы Python в базе данных SQLite с помощью адаптеров объектов и преобразовывать типы SQLite в типы Python с помощью модуля sqlite3 и преобразователей.
Адаптеры и преобразователи по умолчанию (устарели)
Примечание
Адаптеры и преобразователи по умолчанию объявлены устаревшими в Python 3.12. Вместо них используйте примеры адаптеров и преобразователей и настройте их в соответствии со своими потребностями.
Устаревшие адаптеры и преобразователи по умолчанию включают:
- Адаптер, преобразующий объекты
datetime.dateвstringsв формате ISO 8601. - Адаптер, преобразующий объекты
datetime.datetimeв строки в формате ISO 8601. - Преобразователь, преобразующий объявленные типы «date» в объекты
datetime.date. - Преобразователь, преобразующий объявленные типы «timestamp» в объекты
datetime.datetime. Дробная часть будет усечена до 6 цифр (точность до микросекунд).
Примечание
Преобразователь типа «timestamp» по умолчанию игнорирует смещения UTC в базе данных и всегда возвращает объект datetime.datetime без информации о часовом поясе. Чтобы сохранять смещения UTC в метках времени, либо отключите преобразователи, либо зарегистрируйте преобразователь с учётом смещения с помощью register_converter().
Устарело с версии 3.12.
Интерфейс командной строки
Модуль sqlite3 можно запустить как скрипт с помощью переключателя -m интерпретатора, чтобы получить простую оболочку SQLite. Синтаксис аргументов следующий:
python -m sqlite3 [-h] [-v] [filename] [sql]
Введите .quit или CTRL-D, чтобы выйти из оболочки.
-
-h, --help -
Вывести справку по интерфейсу командной строки.
-
-v, --version -
Вывести версию используемой библиотеки SQLite.
Добавлено в версии 3.12.
Практические руководства
Как использовать заполнители для привязки значений в SQL-запросах
Для операций SQL обычно требуется использовать значения из переменных Python. Однако будьте осторожны и не используйте строковые операции Python для составления запросов: они уязвимы к атакам с внедрением SQL-кода. Например, злоумышленник может просто закрыть одинарную кавычку и внедрить OR TRUE, чтобы выбрать все строки:
>>> # Never do this -- insecure! >>> symbol = input() ' OR TRUE; -- >>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol >>> print(sql) SELECT * FROM stocks WHERE symbol = '' OR TRUE; --' >>> cur.execute(sql)
Вместо этого используйте подстановку параметров DB-API. Чтобы вставить переменную в строку запроса, используйте в строке заполнитель и подставьте в запрос фактические значения, передав их в виде tuple значений вторым аргументом метода execute() курсора.
В SQL-инструкции можно использовать один из двух видов заполнителей: вопросительные знаки (стиль qmark) или именованные заполнители (стиль named). Для стиля qmark параметры должны быть последовательностью, длина которой должна совпадать с количеством заполнителей, иначе будет вызвано исключение ProgrammingError. Для стиля named параметры должны быть экземпляром dict (или подкласса), который должен содержать ключи для всех именованных параметров; любые дополнительные элементы игнорируются. Вот пример обоих стилей:
con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE lang(name, first_appeared)")
# This is the named style used with executemany():
data = (
{"name": "C", "year": 1972},
{"name": "Fortran", "year": 1957},
{"name": "Python", "year": 1991},
{"name": "Go", "year": 2009},
)
cur.executemany("INSERT INTO lang VALUES(:name, :year)", data)
# This is the qmark style used in a SELECT query:
params = (1972,)
cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)
print(cur.fetchall())
con.close()
Примечание
Числовые заполнители PEP 249 не поддерживаются. Если их использовать, они будут интерпретированы как именованные заполнители.
Как адаптировать пользовательские типы Python к значениям SQLite
SQLite изначально поддерживает лишь ограниченный набор типов данных. Чтобы хранить пользовательские типы Python в базах данных SQLite, их необходимо адаптировать к одному из типов Python, изначально поддерживаемых SQLite.
Есть два способа адаптировать объекты Python к типам SQLite: позволить объекту адаптировать себя самостоятельно или использовать вызываемый адаптер. Второй способ имеет приоритет над первым. Если библиотека предоставляет пользовательский тип, может быть разумно разрешить этому типу адаптировать себя самостоятельно. Разработчику приложения, возможно, удобнее напрямую управлять процессом, регистрируя пользовательские функции адаптера.
Как создавать адаптируемые объекты
Предположим, у нас есть класс Point, представляющий пару координат x и y в декартовой системе координат. Пара координат будет храниться в базе данных в виде текстовой строки, где координаты разделены точкой с запятой. Это можно реализовать, добавив метод __conform__(self, protocol), который возвращает адаптированное значение. Объект, переданный в protocol, будет иметь тип PrepareProtocol.
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __conform__(self, protocol):
if protocol is sqlite3.PrepareProtocol:
return f"{self.x};{self.y}"
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("SELECT ?", (Point(4.0, -3.2),))
print(cur.fetchone()[0])
con.close()
Как регистрировать вызываемые адаптеры
Другой вариант — создать функцию, преобразующую объект Python в тип, совместимый с SQLite. Затем эту функцию можно зарегистрировать с помощью register_adapter().
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def adapt_point(point):
return f"{point.x};{point.y}"
sqlite3.register_adapter(Point, adapt_point)
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("SELECT ?", (Point(1.0, 2.5),))
print(cur.fetchone()[0])
con.close()
Как преобразовывать значения SQLite в пользовательские типы Python
Адаптер позволяет преобразовывать пользовательские типы Python в значения SQLite. Чтобы преобразовывать значения SQLite в пользовательские типы Python, используются преобразователи.
Вернёмся к классу Point. Мы сохранили координаты x и y в SQLite в виде строк, разделённых точкой с запятой.
Сначала определим функцию-преобразователь, которая принимает строку в качестве параметра и создаёт из неё объект Point.
Примечание
Функции-преобразователи всегда получают объект bytes независимо от базового типа данных SQLite.
def convert_point(s):
x, y = map(float, s.split(b";"))
return Point(x, y)
Теперь нужно указать sqlite3, когда следует преобразовывать заданное значение SQLite. Это делается при подключении к базе данных с помощью параметра detect_types функции connect(). Есть три варианта:
- Неявно: установите для detect_types значение
PARSE_DECLTYPES - Явно: установите для detect_types значение
PARSE_COLNAMES - Оба варианта: установите для detect_types значение
sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES. Имена столбцов имеют приоритет над объявленными типами.
В следующем примере показаны неявный и явный подходы:
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __repr__(self):
return f"Point({self.x}, {self.y})"
def adapt_point(point):
return f"{point.x};{point.y}"
def convert_point(s):
x, y = list(map(float, s.split(b";")))
return Point(x, y)
# Register the adapter and converter
sqlite3.register_adapter(Point, adapt_point)
sqlite3.register_converter("point", convert_point)
# 1) Parse using declared types
p = Point(4.0, -3.2)
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.execute("CREATE TABLE test(p point)")
cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
cur.execute("SELECT p FROM test")
print("with declared types:", cur.fetchone()[0])
cur.close()
con.close()
# 2) Parse using column names
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
cur = con.execute("CREATE TABLE test(p)")
cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
cur.execute('SELECT p AS "p [point]" FROM test')
print("with column names:", cur.fetchone()[0])
cur.close()
con.close()
Примеры адаптеров и преобразователей
В этом разделе приведены примеры распространённых адаптеров и преобразователей.
import datetime as dt
import sqlite3
def adapt_date_iso(val):
"""Adapt datetime.date to ISO 8601 date."""
return val.isoformat()
def adapt_datetime_iso(val):
"""Adapt datetime.datetime to timezone-naive ISO 8601 date."""
return val.replace(tzinfo=None).isoformat()
def adapt_datetime_epoch(val):
"""Adapt datetime.datetime to Unix timestamp."""
return int(val.timestamp())
sqlite3.register_adapter(dt.date, adapt_date_iso)
sqlite3.register_adapter(dt.datetime, adapt_datetime_iso)
sqlite3.register_adapter(dt.datetime, adapt_datetime_epoch)
def convert_date(val):
"""Convert ISO 8601 date to datetime.date object."""
return dt.date.fromisoformat(val.decode())
def convert_datetime(val):
"""Convert ISO 8601 datetime to datetime.datetime object."""
return dt.datetime.fromisoformat(val.decode())
def convert_timestamp(val):
"""Convert Unix epoch timestamp to datetime.datetime object."""
return dt.datetime.fromtimestamp(int(val))
sqlite3.register_converter("date", convert_date)
sqlite3.register_converter("datetime", convert_datetime)
sqlite3.register_converter("timestamp", convert_timestamp)
Как использовать сокращённые методы подключения
При использовании методов execute(), executemany() и executescript() класса Connection код получается короче, поскольку не нужно явно создавать объекты Cursor (часто избыточные). Вместо этого объекты Cursor создаются неявно, а эти сокращённые методы возвращают объекты курсора. Таким образом, можно выполнить инструкцию SELECT и сразу перебрать её результаты, вызвав объект Connection всего один раз.
# Create and fill the table.
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(name, first_appeared)")
data = [
("C++", 1985),
("Objective-C", 1984),
]
con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data)
# Print the table contents
for row in con.execute("SELECT name, first_appeared FROM lang"):
print(row)
print("I just deleted", con.execute("DELETE FROM lang").rowcount, "rows")
# close() is not a shortcut method and it's not called automatically;
# the connection object should be closed manually
con.close()
Как использовать менеджер контекста подключения
Объект Connection можно использовать как менеджер контекста, который автоматически фиксирует или откатывает открытые транзакции при выходе из тела менеджера контекста. Если выполнение тела инструкции with завершается без исключений, транзакция фиксируется. Если фиксация завершается неудачей или в теле инструкции with возникает необработанное исключение, транзакция откатывается. Если autocommit имеет значение False, после фиксации или отката неявно открывается новая транзакция.
Если при выходе из тела инструкции with нет открытой транзакции или если autocommit имеет значение True, менеджер контекста ничего не делает.
Примечание
Менеджер контекста не открывает новую транзакцию неявно и не закрывает подключение. Если вам нужен менеджер контекста, закрывающий подключение, рассмотрите возможность использования contextlib.closing().
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)")
# Successful, con.commit() is called automatically afterwards
with con:
con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))
# con.rollback() is called after the with block finishes with an exception,
# the exception is still raised and must be caught
try:
with con:
con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))
except sqlite3.IntegrityError:
print("couldn't add Python twice")
# Connection object used as context manager only commits or rollbacks transactions,
# so the connection object should be closed manually
con.close()
Как работать с URI SQLite
Полезные приёмы работы с URI:
- Открыть базу данных в режиме только для чтения:
>>> con = sqlite3.connect("file:tutorial.db?mode=ro", uri=True)
>>> con.execute("CREATE TABLE readonly(data)")
Traceback (most recent call last):
OperationalError: attempt to write a readonly database
>>> con.close()
- Не создавать неявно новый файл базы данных, если он ещё не существует; если создать новый файл не удастся, будет вызвано исключение
OperationalError:
>>> con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True)
Traceback (most recent call last):
OperationalError: unable to open database file
- Создать общую именованную базу данных в памяти:
db = "file:mem1?mode=memory&cache=shared"
con1 = sqlite3.connect(db, uri=True)
con2 = sqlite3.connect(db, uri=True)
with con1:
con1.execute("CREATE TABLE shared(data)")
con1.execute("INSERT INTO shared VALUES(28)")
res = con2.execute("SELECT data FROM shared")
assert res.fetchone() == (28,)
con1.close()
con2.close()
Дополнительную информацию об этой возможности, включая список параметров, можно найти в документации SQLite по URI.
Как создавать и использовать фабрики строк
По умолчанию sqlite3 представляет каждую строку в виде tuple. Если tuple не подходит для ваших задач, можно использовать класс sqlite3.Row или пользовательскую row_factory.
Хотя row_factory является атрибутом как Cursor, так и Connection, рекомендуется задавать Connection.row_factory, чтобы все курсоры, созданные этим подключением, использовали одну и ту же фабрику строк.
Row обеспечивает доступ к столбцам по индексу и по имени без учёта регистра, практически не увеличивая расход памяти и не снижая производительность по сравнению с tuple. Чтобы использовать Row в качестве фабрики строк, присвойте его атрибуту row_factory:
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = sqlite3.Row
Теперь запросы возвращают объекты Row:
>>> res = con.execute("SELECT 'Earth' AS name, 6378 AS radius")
>>> row = res.fetchone()
>>> row.keys()
['name', 'radius']
>>> row[0] # Access by index.
'Earth'
>>> row["name"] # Access by name.
'Earth'
>>> row["RADIUS"] # Column names are case-insensitive.
6378
>>> con.close()
Примечание
В инструкции SELECT можно опустить предложение FROM, как в примере выше. В таких случаях SQLite возвращает одну строку со столбцами, определёнными выражениями, например литералами с заданными псевдонимами expr AS alias.
Можно создать пользовательскую row_factory, которая возвращает каждую строку в виде dict, сопоставляя имена столбцов со значениями:
def dict_factory(cursor, row):
fields = [column[0] for column in cursor.description]
return {key: value for key, value in zip(fields, row)}
При её использовании запросы возвращают dict вместо tuple:
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = dict_factory
>>> for row in con.execute("SELECT 1 AS a, 2 AS b"):
... print(row)
{'a': 1, 'b': 2}
>>> con.close()
Следующая фабрика строк возвращает именованный кортеж:
from collections import namedtuple
def namedtuple_factory(cursor, row):
fields = [column[0] for column in cursor.description]
cls = namedtuple("Row", fields)
return cls._make(row)
namedtuple_factory() можно использовать следующим образом:
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = namedtuple_factory
>>> cur = con.execute("SELECT 1 AS a, 2 AS b")
>>> row = cur.fetchone()
>>> row
Row(a=1, b=2)
>>> row[0] # Indexed access.
1
>>> row.b # Attribute access.
2
>>> con.close()
Немного изменив приведённый выше пример, его можно адаптировать для использования dataclass или любого другого пользовательского класса вместо namedtuple.
Как обрабатывать текстовые кодировки, отличные от UTF-8
По умолчанию sqlite3 использует str для адаптации значений SQLite с типом данных TEXT. Это хорошо работает для текста в кодировке UTF-8, но может не сработать для других кодировок и некорректного UTF-8. В таких случаях можно использовать пользовательскую text_factory.
Из-за гибкой типизации SQLite нередко встречаются столбцы таблиц с типом данных TEXT, содержащие данные в кодировке, отличной от UTF-8, или даже произвольные данные. Для примера предположим, что у нас есть база данных с текстом в кодировке ISO-8859-2 (Latin-2), например таблица записей чешско-английского словаря. Предположим, что у нас есть экземпляр Connection con, подключённый к этой базе данных. Текст в кодировке Latin-2 можно декодировать с помощью следующей text_factory:
con.text_factory = lambda data: str(data, encoding="latin2")
Для некорректного UTF-8 или произвольных данных, хранящихся в столбцах таблицы TEXT, можно использовать следующий приём, взятый из руководства Unicode HOWTO:
con.text_factory = lambda data: str(data, errors="surrogateescape")
Примечание
API модуля sqlite3 не поддерживает строки, содержащие суррогаты.
См. также
Пояснение
Управление транзакциями
sqlite3 предоставляет несколько способов управления тем, открываются ли транзакции базы данных, когда и каким образом. Рекомендуется управлять транзакциями с помощью атрибута autocommit, а вариант управления транзакциями с помощью атрибута isolation_level сохраняет поведение, существовавшее до Python 3.12.
Управление транзакциями с помощью атрибута autocommit
Рекомендуемый способ управления поведением транзакций — атрибут Connection.autocommit. Желательно задавать его с помощью параметра autocommit функции connect().
Рекомендуется установить для autocommit значение False, которое подразумевает управление транзакциями в соответствии с PEP 249. Это означает следующее:
-
sqlite3обеспечивает постоянное наличие открытой транзакции, поэтому вызовыconnect(),Connection.commit()иConnection.rollback()неявно открывают новую транзакцию (в двух последних случаях — сразу после закрытия текущей).sqlite3использует инструкцииBEGIN DEFERREDпри открытии транзакций. - Транзакции следует явно фиксировать с помощью
commit(). - Транзакции следует явно откатывать с помощью
rollback(). - Если подключение к базе данных
close()закрывается при наличии незафиксированных изменений, выполняется неявный откат.
Установите для autocommit значение True, чтобы включить режим autocommit SQLite. В этом режиме методы Connection.commit() и Connection.rollback() не оказывают эффекта. Обратите внимание, что режим autocommit SQLite отличается от атрибута Connection.autocommit, обеспечивающего совместимое с PEP 249 управление транзакциями; для проверки низкоуровневого режима autocommit SQLite используйте Connection.in_transaction.
Установите для autocommit значение LEGACY_TRANSACTION_CONTROL, чтобы оставить управление поведением транзакций атрибуту Connection.isolation_level. Дополнительные сведения см. в разделе Управление транзакциями с помощью атрибута isolation_level.
Управление транзакциями с помощью атрибута isolation_level
Примечание
Рекомендуется управлять транзакциями с помощью атрибута autocommit. См. раздел Управление транзакциями с помощью атрибута autocommit.
Если для Connection.autocommit установлено значение LEGACY_TRANSACTION_CONTROL (по умолчанию), поведение транзакций регулируется атрибутом Connection.isolation_level. В противном случае isolation_level не оказывает эффекта.
Если атрибуту подключения isolation_level присвоено значение, отличное от None, новые транзакции неявно открываются перед выполнением инструкций INSERT, UPDATE, DELETE или REPLACE методами execute() и executemany(); для остальных инструкций неявное управление транзакциями не выполняется. Используйте методы commit() и rollback() для фиксации и отката ожидающих транзакций соответственно. С помощью атрибута isolation_level можно выбрать базовое поведение транзакций SQLite — то есть определить, выполняет ли sqlite3 неявно и какие именно инструкции BEGIN.
Если для isolation_level установлено значение None, транзакции вообще не открываются неявно. Это оставляет базовую библиотеку SQLite в режиме autocommit, но позволяет пользователю самостоятельно управлять транзакциями с помощью явных инструкций SQL. Проверить режим autocommit базовой библиотеки SQLite можно с помощью атрибута in_transaction.
Метод executescript() неявно фиксирует любую ожидающую транзакцию перед выполнением заданного SQL-скрипта независимо от значения isolation_level.
Изменено в версии 3.6: Раньше sqlite3 неявно фиксировал открытую транзакцию перед инструкциями DDL. Теперь это не так.
Изменено в версии 3.12: Теперь рекомендуется управлять транзакциями с помощью атрибута autocommit.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/sqlite3.html