Spec-Zone.ru › Python 3.12

sqlite3 — интерфейс DB-API 2.0 для баз данных SQLite

Исходный код: Lib/sqlite3/

SQLite — это библиотека C, предоставляющая лёгкую дисковую базу данных, для которой не требуется отдельный серверный процесс и доступ к которой осуществляется с помощью нестандартного варианта языка запросов SQL. Некоторые приложения могут использовать SQLite для внутреннего хранения данных. Также можно создать прототип приложения с помощью SQLite, а затем перенести код в более крупную базу данных, например PostgreSQL или Oracle.

Модуль sqlite3 написан Герхардом Хэрингом. Он предоставляет интерфейс SQL, совместимый со спецификацией DB-API 2.0, описанной в PEP 249, и требует SQLite версии 3.7.15 или новее.

Этот документ состоит из четырёх основных разделов:

  • Руководство рассказывает, как использовать модуль sqlite3.
  • Справочник описывает классы и функции, определённые в этом модуле.
  • Практические руководства подробно описывают выполнение конкретных задач.
  • Объяснение содержит подробную информацию об управлении транзакциями.

См. также

https://www.sqlite.org

Веб-страница SQLite; документация описывает синтаксис и доступные типы данных поддерживаемого диалекта SQL.

https://www.w3schools.com/sql/

Руководство, справочник и примеры для изучения синтаксиса SQL.

PEP 249 — спецификация 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. Если заданы оба флага, имена столбцов имеют приоритет над объявленными типами. Типы нельзя определить для вычисляемых полей (например, max(data)), даже если задан параметр detect_types; вместо этого будет возвращён str. По умолчанию (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.

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, /)

Регистрирует вызываемый объект в качестве адаптера для преобразования типа Python type в тип SQLite. Адаптер вызывается с объектом Python типа type в качестве единственного аргумента и должен возвращать значение типа, изначально поддерживаемого SQLite.

sqlite3.register_converter(typename, converter, /)

Регистрирует вызываемый объект в качестве преобразователя, который преобразует объекты SQLite типа typename в объект Python определённого типа. Преобразователь вызывается для всех значений SQLite типа typename; ему передаётся объект bytes, и он должен возвращать объект нужного типа Python. Сведения о работе определения типов см. в описании параметра detect_types функции connect().

Примечание: typename и имя типа в запросе сопоставляются без учёта регистра.

Константы модуля

sqlite3.LEGACY_TRANSACTION_CONTROL

Задайте для autocommit эту константу, чтобы выбрать старый стиль управления транзакциями (до Python 3.12). Дополнительные сведения см. в разделе Управление транзакциями с помощью атрибута isolation_level.

sqlite3.PARSE_COLNAMES

Передайте это значение флага параметру detect_types функции connect(), чтобы искать функцию-преобразователь по имени типа, извлечённому из имени столбца в запросе и используемому в качестве ключа словаря преобразователей. Имя типа должно быть заключено в квадратные скобки ([]).

SELECT p as "p [point]" FROM test;  ! will look up converter "point"

Этот флаг можно комбинировать с PARSE_DECLTYPES с помощью оператора | (побитовое ИЛИ).

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 с помощью оператора | (побитовое ИЛИ).

sqlite3.SQLITE_OK
sqlite3.SQLITE_DENY
sqlite3.SQLITE_IGNORE

Флаги, которые должен возвращать переданный в Connection.set_authorizer() вызываемый объект authorizer_callback, указывая, следует ли:

  • разрешить доступ (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.version

Номер версии этого модуля в виде string. Это не версия библиотеки SQLite.

Устарело с версии 3.12, будет удалено в версии 3.14: Раньше эта константа отражала номер версии пакета pysqlite — сторонней библиотеки, изменения из которой прежде переносились в sqlite3. В настоящее время она не имеет смысла или практической ценности.

sqlite3.version_info

Номер версии этого модуля в виде tuple из integers. Это не версия библиотеки SQLite.

Устарело с версии 3.12, будет удалено в версии 3.14: Раньше эта константа отражала номер версии пакета pysqlite — сторонней библиотеки, изменения из которой прежде переносились в sqlite3. В настоящее время она не имеет смысла или практической ценности.

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: параметры конфигурации соединения с базой данных

Объекты соединения

class sqlite3.Connection

Каждая открытая база данных SQLite представлена объектом Connection, который создаётся с помощью sqlite3.connect(). Их основное назначение — создание объектов Cursor и управление транзакциями.

См. также

  • Как использовать методы-сокращения соединения
  • Как использовать менеджер контекста соединения

Соединение с базой данных SQLite имеет следующие атрибуты и методы:

cursor(factory=Cursor)

Создаёт и возвращает объект Cursor. Метод cursor принимает один необязательный параметр factory. Если он указан, это должен быть вызываемый объект, возвращающий экземпляр Cursor или его подклассов.

blobopen(table, column, row, /, *, readonly=False, name='main')

Открывает дескриптор Blob для существующего BLOB.

Параметры:
  • table (str) – Имя таблицы, в которой находится большой двоичный объект.
  • column (str) – Имя столбца, в котором находится большой двоичный объект.
  • row (str) – Имя строки, в которой находится большой двоичный объект.
  • 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 выполнять дополнительные оптимизации.
Вызывает исключение:

NotSupportedError – Если параметр deterministic используется с версиями SQLite старше 3.8.3.

Изменено в версии 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()
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()
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: Имя сортировки может содержать любые символы Юникода. Ранее допускались только символы 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.

set_progress_handler(progress_handler, n)

Зарегистрируйте вызываемый объект progress_handler, который будет вызываться через каждые n инструкций виртуальной машины SQLite. Это полезно, если нужно получать вызовы из SQLite во время длительных операций, например для обновления графического интерфейса.

Чтобы очистить ранее установленный обработчик хода выполнения, вызовите метод, передав None в качестве progress_handler.

Возврат ненулевого значения из функции-обработчика завершит выполняющийся запрос и вызовет исключение DatabaseError.

set_trace_callback(trace_callback)

Зарегистрируйте вызываемый объект trace_callback, который будет вызываться для каждого оператора SQL, фактически выполняемого серверной частью SQLite.

Единственный аргумент, передаваемый функции обратного вызова, — выполняемый оператор (в виде str). Возвращаемое значение функции обратного вызова игнорируется. Обратите внимание, что серверная часть выполняет не только операторы, переданные методам Cursor.execute(). К другим источникам относятся управление транзакциями модуля sqlite3 и выполнение триггеров, определённых в текущей базе данных.

Передача None в качестве trace_callback отключит функцию обратного вызова трассировки.

Примечание

Исключения, возникающие в функции обратного вызова трассировки, не передаются дальше. Для разработки и отладки используйте enable_callback_tracebacks(), чтобы включить вывод трассировок стека для исключений, возникающих в функции обратного вызова трассировки.

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

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()

Возвращает итератор для выгрузки базы данных в виде исходного кода SQL. Полезно при сохранении базы данных в памяти для последующего восстановления. Аналогично команде .dump в оболочке sqlite3.

Пример:

# 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

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.

Подробнее см. в разделе Как создавать и использовать фабрики строк.

text_factory

Вызываемый объект, принимающий параметр типа bytes и возвращающий его текстовое представление. Вызываемый объект вызывается для значений SQLite с типом данных TEXT. По умолчанию этому атрибуту присвоено значение str.

Подробнее см. в разделе Как обрабатывать текстовые данные в кодировках, отличных от UTF-8.

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.

Если autocommit имеет значение LEGACY_TRANSACTION_CONTROL, isolation_level не равно None, sql является инструкцией INSERT, UPDATE, DELETE или REPLACE и открытой транзакции нет, перед выполнением sql неявно открывается транзакция.

Устарело с версии 3.12, будет удалено в версии 3.14: Если используются именованные заполнители, а parameters является последовательностью, а не dict, выдаётся предупреждение DeprecationWarning. Начиная с Python 3.14 вместо этого будет вызвано исключение ProgrammingError.

Для выполнения нескольких инструкций SQL используйте executescript().

executemany(sql, parameters, /)

Для каждого элемента в parameters повторно выполняет параметризованную инструкцию SQL DML sql.

Использует ту же обработку неявных транзакций, что и execute().

Параметры:
  • sql (str) – Одна инструкция SQL DML.
  • parameters (итерируемый объект) – Итерируемый объект с параметрами для связывания с заполнителями в sql. См. раздел Как использовать заполнители для связывания значений в запросах SQL.
Вызывает исключения:

ProgrammingError – Если sql содержит более одной инструкции SQL или не является инструкцией DML.

Пример:

rows = [
    ("row1",),
    ("row2",),
]
# cur is an sqlite3.Cursor object
cur.executemany("INSERT INTO data VALUES(?)", rows)

Примечание

Все полученные строки отбрасываются, в том числе для инструкций DML с предложениями RETURNING.

Устарело с версии 3.12, будет удалено в версии 3.14: Если используются именованные заполнители, а элементы parameters являются последовательностями, а не объектами dict, выдаётся предупреждение DeprecationWarning. Начиная с Python 3.14 вместо этого будет вызвано исключение ProgrammingError.

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().

fetchall()

Возвращает все оставшиеся строки результата запроса в виде list. Если строк нет, возвращает пустой список. Обратите внимание, что атрибут arraysize может влиять на производительность этой операции.

close()

Немедленно закрывает курсор (вместо того чтобы ждать вызова __del__).

После этого использовать курсор будет невозможно; при попытке выполнить с ним любую операцию будет вызвано исключение ProgrammingError.

setinputsizes(sizes, /)

Требуется спецификацией DB-API. В sqlite3 ничего не делает.

setoutputsize(size, column=None, /)

Требуется спецификацией DB-API. В sqlite3 ничего не делает.

arraysize

Атрибут для чтения и записи, управляющий числом строк, возвращаемых методом fetchmany(). Значение по умолчанию — 1, то есть при каждом вызове извлекается одна строка.

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 родительского соединения.

Подробнее см. в разделе Как создавать и использовать фабрики строк.

Объекты строк

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. Например, если для аргумента deterministic в create_function() задано значение True, а базовая библиотека 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
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.isoformat()

def adapt_datetime_epoch(val):
    """Adapt datetime.datetime to Unix timestamp."""
    return int(val.timestamp())

sqlite3.register_adapter(datetime.date, adapt_date_iso)
sqlite3.register_adapter(datetime.datetime, adapt_datetime_iso)
sqlite3.register_adapter(datetime.datetime, adapt_datetime_epoch)

def convert_date(val):
    """Convert ISO 8601 date to datetime.date object."""
    return datetime.date.fromisoformat(val.decode())

def convert_datetime(val):
    """Convert ISO 8601 datetime to datetime.datetime object."""
    return datetime.datetime.fromisoformat(val.decode())

def convert_timestamp(val):
    """Convert Unix epoch timestamp to datetime.datetime object."""
    return datetime.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()

Дополнительные сведения об этой возможности, включая список параметров, приведены в документации по URI SQLite.

Как создавать и использовать фабрики строк

По умолчанию 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:

con.text_factory = lambda data: str(data, errors="surrogateescape")

Примечание

API модуля sqlite3 не поддерживает строки, содержащие суррогаты.

См. также

Руководство по Unicode

Пояснения

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

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, новые транзакции неявно открываются перед тем, как execute() и executemany() выполнят инструкции INSERT, UPDATE, DELETE или REPLACE; для других инструкций неявное управление транзакциями не выполняется. Используйте методы 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/sqlite3.html

Spec-Zone.ru

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