Spec-Zone.ru › Python 3.14

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, вставили в неё данные и несколькими способами получили значения из неё.

См. также

  • Дополнительные материалы в разделе Практические руководства:

    • Как использовать заполнители для привязки значений в запросах SQL
    • Как адаптировать пользовательские типы Python к значениям SQLite
    • Как преобразовать значения SQLite в пользовательские типы Python
    • Как использовать менеджер контекста подключения
    • Как создавать и использовать фабрики строк
  • Пояснения содержат подробные сведения об управлении транзакциями.

Справочник

Функции модуля

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.
Тип возвращаемого значения:

Connection

Вызывает событие аудита 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:

  1. Однопоточный: в этом режиме все мьютексы отключены, и SQLite небезопасно использовать одновременно более чем в одном потоке.
  2. Многопоточный: в этом режиме SQLite можно безопасно использовать в нескольких потоках при условии, что одно и то же соединение с базой данных не используется одновременно в двух или более потоках.
  3. Сериализованный: в сериализованном режиме SQLite можно безопасно использовать в нескольких потоках без ограничений.

Режим многопоточности SQLite

threadsafety

SQLITE_THREADSAFE

Значение для 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

Примечание

Размер большого двоичного объекта нельзя изменить с помощью класса Blob. Используйте функцию SQL zeroblob, чтобы создать большой двоичный объект фиксированного размера.

Добавлено в версии 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()

См. также

Обработка текстовых кодировок, отличных от UTF-8

Изменено в версии 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" для временной базы данных или имя пользовательской базы данных, подключённой с помощью оператора SQL ATTACH 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.

См. также

Обработка текстовых кодировок, отличных от UTF-8

getlimit(category, /)

Получает ограничение времени выполнения для подключения.

Параметры:

category (int) – Категория ограничений SQLite, значение которой нужно получить.

Тип возвращаемого значения:

int

Вызывает:

ProgrammingError – Если базовая библиотека SQLite не распознаёт category.

Пример: получить максимальную длину оператора SQL для Connection con (значение по умолчанию — 1000000000):

>>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH)
1000000000

Добавлено в версии 3.11.

setlimit(category, limit, /)

Устанавливает ограничение времени выполнения для подключения. Попытки увеличить ограничение выше его жёсткого верхнего предела будут без предупреждения ограничены этим пределом. Независимо от того, изменилось ли ограничение, возвращается его предыдущее значение.

Параметры:
  • category (int) – Категория ограничений SQLite, для которой устанавливается значение.
  • limit (int) – Новое значение ограничения. Если значение отрицательное, текущее ограничение не изменяется.
Тип возвращаемого значения:

int

Вызывает:

ProgrammingError – Если базовая библиотека SQLite не распознаёт category.

Пример: ограничить количество подключённых баз данных значением 1 для Connection con (ограничение по умолчанию — 10):

>>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1)
10
>>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED)
1

Добавлено в версии 3.11.

getconfig(op, /)

Запрашивает логический параметр конфигурации подключения.

Параметры:

op (int) – Код SQLITE_DBCONFIG.

Тип возвращаемого значения:

bool

Добавлено в версии 3.12.

setconfig(op, enable=True, /)

Задать логический параметр конфигурации соединения.

Параметры:
  • op (int) – Код SQLITE_DBCONFIG.
  • enable (bool) – True, если параметр конфигурации следует включить (по умолчанию); False, если его следует отключить.

Добавлено в версии 3.12.

serialize(*, name='main')

Сериализовать базу данных в объект bytes. Для обычного файла базы данных на диске сериализация представляет собой копию файла. Для базы данных в памяти или «временной» базы данных сериализация представляет собой ту же последовательность байтов, которая была бы записана на диск при резервном копировании этой базы данных.

Параметры:

name (str) – Имя сериализуемой базы данных. По умолчанию — "main".

Тип возвращаемого значения:

bytes

Примечание

Этот метод доступен только в том случае, если в используемой библиотеке SQLite есть API сериализации.

Добавлено в версии 3.11.

deserialize(data, /, *, name='main')

Десериализовать базу данных serialized в Connection. Этот метод отключает соединение с базой данных name и повторно открывает name как базу данных в памяти на основе сериализованных данных, содержащихся в data.

Параметры:
  • data (bytes) – Сериализованная база данных.
  • name (str) – Имя базы данных, в которую выполняется десериализация. По умолчанию — "main".
Вызывает исключения:
  • 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

None

NULL

int

INTEGER

float

REAL

str

TEXT

bytes

BLOB

По умолчанию типы SQLite преобразуются в типы Python следующим образом:

Тип SQLite

Тип Python

NULL

None

INTEGER

int

REAL

float

TEXT

зависит от text_factory, по умолчанию — str

BLOB

bytes

Систему типов модуля 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 не поддерживает строки, содержащие суррогаты.

См. также

Unicode HOWTO

Пояснение

Управление транзакциями

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API