Документация Python неофициальный перевод
Содержание страницы

sqlite3 – интерфейс DB-API 2.0 для баз данных SQLitesqlite3 – DB-API 2.0 interface for SQLite databases

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

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

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

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

См. также

https://www.sqlite.org

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

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

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

PEP 249 – спецификация API баз данных 2.0

PEP написан Марком-Андре Лембургом.

Учебное руководствоTutorial

В этом руководстве вы создадите базу данных фильмов Монти Пайтона, используя базовые возможности sqlite3. Предполагается базовое понимание концепций баз данных, включая курсоры и транзакции.

Сначала нужно создать новую базу данных и открыть соединение с базой данных, чтобы sqlite3 мог с ней работать. Вызовите sqlite3.connect(), чтобы создать соединение с базой данных tutorial.db в текущем рабочем каталоге; если она не существует, она будет неявно создана:

import sqlite3
con = sqlite3.connect("tutorial.db")

Возвращаемый объект Connection con представляет соединение с базой данных на диске.

Для выполнения 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()  # Необходимо зафиксировать транзакцию после выполнения 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

С помощью модуля sqlite3 создана база данных SQLite, вставлены данные и извлечены из неё значения несколькими способами.

СсылкаReference

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

sqlite3.connect(database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=100, uri=False)

Открывает соединение с базой данных SQLite.

Параметры
  • database (path-like object) – путь к файлу базы данных, который требуется открыть. Передайте ":memory:", чтобы открыть подключение к базе данных, находящейся в оперативной памяти, а не на диске.

  • timeout (float) – сколько секунд соединение должно ждать перед возбуждением исключения OperationalError, когда таблица заблокирована. Если другое соединение открывает транзакцию для изменения таблицы, эта таблица будет заблокирована до фиксации транзакции. По умолчанию пять секунд.

  • detect_types (int) – Control whether and how data types not natively supported by SQLite are looked up to be converted to Python types, using the converters registered with register_converter(). Set it to any combination (using |, bitwise or) of PARSE_DECLTYPES and PARSE_COLNAMES to enable this. Column names takes precedence over declared types if both flags are set. Types cannot be detected for generated fields (for example max(data)), even when the detect_types parameter is set; str will be returned instead. By default (0), type detection is disabled.

  • isolation_level (str | None) – isolation_level подключения, управляющий тем, открываются ли транзакции неявно и каким образом. Может быть "DEFERRED" (по умолчанию), "EXCLUSIVE" или "IMMEDIATE"; либо None для отключения неявного открытия транзакций. Подробнее см. Управление транзакциями.

  • check_same_thread (bool) – Если True (по умолчанию), будет возбуждено ProgrammingError, если соединение с базой данных используется потоком, отличным от того, который его создал. Если False, к соединению можно обращаться из нескольких потоков; пользователю может потребоваться сериализовать операции записи во избежание повреждения данных. См. threadsafety для получения дополнительной информации.

  • factory (Connection) – пользовательский подкласс Connection для создания соединения, если не используется стандартный класс Connection.

  • cached_statements (int) – количество операторов, которые sqlite3 должен кешировать внутри себя для этого подключения, чтобы избежать издержек на разбор. По умолчанию – 100 операторов.

  • uri (bool) – Если установлено в True, database интерпретируется как URI с путём к файлу и необязательной строкой запроса. Часть схемы должна быть "file:", а путь может быть относительным или абсолютным. Строка запроса позволяет передавать параметры SQLite, открывая возможности, описанные в Работа с URI SQLite.

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

Connection

Вызывает событие аудита sqlite3.connect с аргументом database.

Вызывает событие аудита sqlite3.connect/handle с аргументом connection_handle.

Новое в версии 3.4: Параметр uri.

Изменено в версии 3.7: database теперь также может быть объектом, подобным пути, а не только строкой.

Новое в версии 3.10: Событие аудита sqlite3.connect/handle.

sqlite3.complete_statement(statement)

Возвращает True, если строка statement содержит один или несколько полных SQL-операторов. Никакая синтаксическая проверка или разбор не выполняются, кроме проверки отсутствия незакрытых строковых литералов и завершения оператора точкой с запятой.

Например:

>>> sqlite3.complete_statement("SELECT foo FROM bar;")
True
>>> sqlite3.complete_statement("SELECT foo")
False

Эта функция может быть полезна при вводе с командной строки для определения, является ли введённый текст полным SQL-оператором, или требуется дополнительный ввод перед вызовом execute().

sqlite3.enable_callback_tracebacks(flag, /)

Включить или отключить трассировку стека в колбэках. По умолчанию трассировки стека в пользовательских функциях, агрегатах, конвертерах, колбэках авторизации и т. д. не выводятся. Если требуется их отладка, можно вызвать эту функцию, установив flag в True. После этого трассировки стека из колбэков будут выводиться через sys.stderr. Используйте False, чтобы снова отключить эту возможность.

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 и имя типа в запросе сравниваются без учёта регистра.

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

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

Флаги, которые должен возвращать вызываемый объект 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, указывающая уровень потокобезопасности, поддерживаемый модулем sqlite3. В настоящее время жёстко задана как 1, что означает «Потоки могут совместно использовать модуль, но не подключения». Однако это не всегда верно. Уровень потокобезопасности, заданный при компиляции библиотеки SQLite, можно проверить следующим запросом:

import sqlite3
con = sqlite3.connect(":memory:")
con.execute("""
    select * from pragma_compile_options
    where compile_options like 'THREADSAFE=%'
""").fetchall()

Обратите внимание, что уровни SQLITE_THREADSAFE не соответствуют уровням DB-API 2.0 threadsafety.

sqlite3.version

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

sqlite3.version_info

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

Объекты ConnectionConnection objects

class sqlite3.Connection

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

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

cursor(factory=Cursor)

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

commit()

Фиксирует любую ожидающую транзакцию в базе данных. Если нет открытой транзакции, этот метод ничего не делает.

rollback()

Откатывает к началу любой ожидающей транзакции. Если открытая транзакция отсутствует, этот метод ничего не делает.

close()

Закрывает соединение с базой данных. Любая ожидающая транзакция не фиксируется автоматически; перед закрытием необходимо вызвать 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 (callback | 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',)
create_aggregate(name, /, n_arg, aggregate_class)

Создать или удалить пользовательскую агрегатную SQL-функцию.

Параметры
  • name (str) – Имя агрегатной SQL-функции.

  • n_arg (int) – Количество аргументов, которое может принимать агрегатная SQL-функция. Если -1, может принимать любое количество аргументов.

  • aggregate_class (class | None) –

    Класс должен реализовывать следующие методы:

    Количество аргументов, которое должен принимать метод 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_collation(name, callable)

Создаёт collation с именем name, используя функцию сравнения callable. callable передаётся два аргумента string, и она должна возвращать integer:

  • 1, если первый больше второго

  • -1, если первый меньше второго

  • 0, если они равны

Следующий пример демонстрирует collation с обратной сортировкой:

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

Удаляет функцию collation, устанавливая callable в None.

interrupt()

Вызовите этот метод из другого потока, чтобы прервать любые запросы, которые могут выполняться на соединении. Прерванные запросы возбудят исключение OperationalError.

set_authorizer(authorizer_callback)

Регистрирует вызываемый объект authorizer_callback для вызова при каждой попытке доступа к столбцу таблицы в базе данных. Колбэк должен возвращать одно из значений SQLITE_OK, SQLITE_DENY или SQLITE_IGNORE, чтобы указать, как обрабатывать доступ к столбцу базовой библиотекой SQLite.

Первый аргумент колбэка указывает, какой тип операции требуется авторизовать. Второй и третий аргументы будут аргументами или None в зависимости от первого аргумента. Четвёртый аргумент – имя базы данных («main», «temp» и т.д.), если применимо. Пятый аргумент – имя самого внутреннего триггера или представления, ответственного за попытку доступа, или None, если эта попытка доступа происходит непосредственно из входного SQL-кода.

Обратитесь к документации SQLite за возможными значениями первого аргумента и значением второго и третьего аргументов в зависимости от первого. Все необходимые константы доступны в модуле sqlite3.

set_progress_handler(progress_handler, n)

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

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

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

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 из разделяемых библиотек, если enabled равен True; иначе отключает эту возможность. Расширения 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)

# Загрузить расширение полнотекстового поиска.
con.execute("select load_extension('./fts3.so')")

# в качестве альтернативы можно загрузить расширение с помощью вызова API:
# con.load_extension("./fts3.so")

# отключить загрузку расширения снова
con.enable_load_extension(False)

# пример из вики SQLite
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)

con.close()
load_extension(path, /)

Загружает расширение SQLite из разделяемой библиотеки, расположенной по адресу path. Перед вызовом этого метода включите загрузку расширений с помощью enable_load_extension().

Возбуждает событие аудита sqlite3.load_extension с аргументами connection, path.

Новое в версии 3.2.

Изменено в версии 3.10: Добавлено событие аудита sqlite3.load_extension.

iterdump()

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

Пример:

# Преобразовать файл example.db в дамп SQL 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()
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)

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

in_transaction

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

True, если транзакция активна (есть незафиксированные изменения), False в противном случае.

Новое в версии 3.2.

isolation_level

Этот атрибут управляет обработкой транзакций, выполняемой sqlite3. Если установлено значение None, транзакции никогда не открываются неявно. Если установлено одно из значений "DEFERRED", "IMMEDIATE" или "EXCLUSIVE", соответствующих базовому поведению транзакций SQLite, выполняется неявное управление транзакциями.

Если параметр isolation_level в connect() не переопределяет его, то по умолчанию используется "", что является псевдонимом для "DEFERRED".

row_factory

Начальный row_factory для объектов Cursor, созданных из этого соединения. Присвоение этому атрибуту не влияет на row_factory существующих курсоров, принадлежащих этому соединению, только новых. По умолчанию установлено None, то есть каждая строка возвращается как tuple.

См. Как создавать и использовать фабрики строк для получения дополнительных сведений.

text_factory

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

Пример:

con = sqlite3.connect(":memory:")
cur = con.cursor()

AUSTRIA = "Österreich"

# по умолчанию строки возвращаются как str
cur.execute("SELECT ?", (AUSTRIA,))
row = cur.fetchone()
assert row[0] == AUSTRIA

# но можно заставить sqlite3 всегда возвращать байтовые строки...
con.text_factory = bytes
cur.execute("SELECT ?", (AUSTRIA,))
row = cur.fetchone()
assert type(row[0]) is bytes
# байтовые строки будут в кодировке UTF-8, если только в базу не попал мусор
# база данных...
assert row[0] == AUSTRIA.encode("utf-8")

# можно также реализовать собственный text_factory...
# здесь реализован такой, который добавляет "foo" ко всем строкам
con.text_factory = lambda x: x.decode("utf-8") + "foo"
cur.execute("SELECT ?", ("bar",))
row = cur.fetchone()
assert row[0] == "barfoo"

con.close()
total_changes

Возвращает общее количество строк базы данных, которые были изменены, вставлены или удалены с момента открытия соединения с базой данных.

Объекты курсораCursor objects

Объект Cursor представляет собой курсор базы данных, который используется для выполнения SQL-запросов и управления контекстом операции выборки. Курсоры создаются с помощью Connection.cursor() или с помощью любого из сокращённых методов соединения.

Объекты курсора являются итераторами, то есть если выполнить execute() запрос SELECT, можно просто перебирать курсор для получения результирующих строк:

for row in cur.execute("SELECT t FROM data"):
    print(row)
class sqlite3.Cursor

Экземпляр Cursor имеет следующие атрибуты и методы.

execute(sql, parameters=(), /)

Выполняет один SQL-запрос, с возможностью привязки значений Python с помощью placeholders.

Параметры
Возбуждает

Warning – Если sql содержит более одного SQL-запроса.

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

Используйте executescript() для выполнения нескольких SQL-запросов.

executemany(sql, parameters, /)

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

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

Параметры
Возбуждает
  • ProgrammingError – Если sql не является запросом DML.

  • Warning – Если sql содержит более одного SQL-запроса.

Пример:

rows = [
    ("row1",),
    ("row2",),
]
# cur – объект sqlite3.Cursor
cur.executemany("INSERT INTO data VALUES(?)", rows)
executescript(sql_script, /)

Выполняет SQL-инструкции из sql_script. Если есть ожидающая транзакция, сначала неявно выполняется COMMIT. Никакого другого неявного управления транзакциями не производится; все управление транзакциями должно быть добавлено в sql_script.

sql_script должен быть string.

Пример:

# cur – объект sqlite3.Cursor
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

Атрибут только для чтения, предоставляющий соединение с базой данных SQLite Connection, принадлежащее курсору. Объект Cursor, созданный вызовом con.cursor(), будет иметь атрибут connection, который ссылается на con:

>>> con = sqlite3.connect(":memory:")
>>> cur = con.cursor()
>>> cur.connection == con
True
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; равен -1 для других запросов, включая запросы CTE. Обновляется только методами execute() и executemany().

row_factory

Управляет представлением строки, извлечённой из этого Cursor. Если None, строка представляется как tuple. Может быть установлен во встроенный sqlite3.Row; или в вызываемый объект, который принимает два аргумента: объект Cursor и tuple значений строки, и возвращает пользовательский объект, представляющий строку SQLite.

По умолчанию равно тому, на что был установлен Connection.row_factory при создании Cursor. Присваивание этому атрибуту не влияет на Connection.row_factory родительского соединения.

См. Как создавать и использовать фабрики строк для получения дополнительных сведений.

Объекты RowRow objects

class sqlite3.Row

Экземпляр Row служит высокооптимизированным row_factory для объектов Connection. Он поддерживает итерацию, проверку равенства, len() и доступ через отображение по имени столбца и индексу.

Два объекта Row считаются равными, если они имеют одинаковые имена столбцов и значения.

См. Как создавать и использовать фабрики строк для получения дополнительных сведений.

keys()

Возвращает list имен столбцов в виде strings. Сразу после запроса это первый элемент каждого кортежа в Cursor.description.

Изменено в версии 3.5: Добавлена поддержка срезов.

Объекты PrepareProtocolPrepareProtocol objects

class sqlite3.PrepareProtocol

Единственное назначение типа PrepareProtocol – служить протоколом адаптации в стиле PEP 246 для объектов, которые могут адаптироваться к встроенным типам SQLite.

ИсключенияExceptions

Иерархия исключений определена в DB-API 2.0 (PEP 249).

exception sqlite3.Warning

Это исключение возбуждается sqlite3, если SQL-запрос не является string, или если несколько запросов переданы в execute() или executemany(). Warning является подклассом Exception.

exception sqlite3.Error

Базовый класс для остальных исключений этого модуля. Используйте его, чтобы перехватывать все ошибки одним оператором except. Error является подклассом Exception.

exception sqlite3.InterfaceError

Это исключение возбуждается sqlite3 при выборке через откат, или если 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

Исключение, возбуждаемое при ошибках программирования sqlite3 API, например при попытке оперировать закрытым Connection или при попытке выполнить запросы, не являющиеся DML, с помощью executemany(). ProgrammingError является подклассом DatabaseError.

exception sqlite3.NotSupportedError

Исключение возникает, если метод или API базы данных не поддерживается используемой библиотекой SQLite. Например, установка deterministic в True в create_function(), если базовая библиотека SQLite не поддерживает детерминированные функции. NotSupportedError является подклассом DatabaseError.

Типы SQLite и PythonSQLite and Python types

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 через адаптеры объектов и можно позволить модулю sqlite3 преобразовывать типы SQLite в типы Python через конвертеры.

Адаптеры и преобразователи по умолчаниюDefault adapters and converters

В модуле datetime есть адаптеры по умолчанию для типов date и datetime. Они отправляются в SQLite как даты/временные метки в формате ISO.

Преобразователи по умолчанию зарегистрированы под именем «date» для datetime.date и под именем «timestamp» для datetime.datetime.

Таким образом, в большинстве случаев можно использовать даты и временные метки из Python без лишних усилий. Формат адаптеров также совместим с экспериментальными функциями даты/времени SQLite.

Следующий пример демонстрирует это.

import sqlite3
import datetime

con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur = con.cursor()
cur.execute("create table test(d date, ts timestamp)")

today = datetime.date.today()
now = datetime.datetime.now()

cur.execute("insert into test(d, ts) values (?, ?)", (today, now))
cur.execute("select d, ts from test")
row = cur.fetchone()
print(today, "=>", row[0], type(row[0]))
print(now, "=>", row[1], type(row[1]))

cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"')
row = cur.fetchone()
print("current_date", row[0], type(row[0]))
print("current_timestamp", row[1], type(row[1]))

con.close()

Если временная метка, хранящаяся в SQLite, имеет дробную часть длиннее 6 знаков, её значение будет усечено до микросекундной точности преобразователем временных меток.

Примечание

Конвертер "timestamp" по умолчанию игнорирует смещения UTC в базе данных и всегда возвращает наивный объект datetime.datetime. Чтобы сохранить смещения UTC в метках времени, либо оставьте конвертеры отключёнными, либо зарегистрируйте конвертер с учётом смещения через register_converter().

Практические руководстваHow-to guides

Как использовать плейсхолдеры для подстановки значений в SQL-запросыHow to use placeholders to bind values in SQL queries

Обычно в SQL-операциях нужно использовать значения из переменных Python. Однако следует остерегаться использования строковых операций Python для сборки запросов, так как они уязвимы для атак с помощью SQL-инъекций. Например, злоумышленник может просто закрыть одинарную кавычку и добавить OR TRUE для выборки всех строк:

>>> # Никогда не делайте этого – это небезопасно!
>>> 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. Для именованного стиля параметры должны быть экземпляром dict (или подкласса), который должен содержать ключи для всех именованных параметров; любые лишние элементы игнорируются. Вот пример обоих стилей:

con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE lang(name, first_appeared)")

# Это стиль с именованными параметрами, используемый с 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)

# Это стиль с вопросительными знаками, используемый в запросе SELECT:
params = (1972,)
cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)
print(cur.fetchall())

Примечание

Числовые плейсхолдеры PEP 249 не поддерживаются. Если их использовать, они будут интерпретироваться как именованные.

Как адаптировать пользовательские типы Python к значениям SQLiteHow to adapt custom Python types to SQLite values

SQLite изначально поддерживает только ограниченный набор типов данных. Чтобы хранить пользовательские типы Python в базах данных SQLite, адаптируйте их к одному из типов Python, которые SQLite понимает изначально.

Существует два способа адаптации объектов Python к типам SQLite: разрешить объекту адаптироваться самостоятельно или использовать вызываемый адаптер. Последний имеет приоритет над первым. Для библиотеки, которая предоставляет пользовательский тип, может иметь смысл разрешить этому типу адаптироваться самостоятельно. Для разработчика приложений может быть более разумным взять прямой контроль, зарегистрировав собственные функции-адаптеры.

Как создавать адаптируемые объектыHow to write adaptable objects

Предположим, у нас есть класс Point, представляющий пару координат x и y в декартовой системе координат. Пара координат будет храниться в базе данных в виде текстовой строки с точкой с запятой в качестве разделителя. Это можно реализовать, добавив метод __conform__(self, 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])

Как регистрировать вызываемые адаптерыHow to register adapter callables

Другая возможность – создать функцию, которая преобразует объект 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])

Как преобразовывать значения SQLite в пользовательские типы PythonHow to convert SQLite values to custom Python types

Написание адаптера позволяет преобразовывать из пользовательских типов 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)

# Зарегистрировать адаптер и конвертер
sqlite3.register_adapter(Point, adapt_point)
sqlite3.register_converter("point", convert_point)

# 1) Разбор с использованием объявленных типов
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) Разбор с использованием имён столбцов
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])

Рецепты адаптеров и конвертеровAdapter and converter recipes

В этом разделе приведены рецепты для распространенных адаптеров и конвертеров.

import datetime
import sqlite3

def adapt_date_iso(val):
    """Адаптировать datetime.date к дате в формате ISO 8601."""
    return val.isoformat()

def adapt_datetime_iso(val):
    """Преобразует datetime.datetime в дату ISO 8601 без часового пояса."""
    return val.isoformat()

def adapt_datetime_epoch(val):
    """Преобразует datetime.datetime в метку времени Unix."""
    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):
    """Преобразует дату ISO 8601 в объект datetime.date."""
    return datetime.date.fromisoformat(val.decode())

def convert_datetime(val):
    """Преобразует дату и время ISO 8601 в объект datetime.datetime."""
    return datetime.datetime.fromisoformat(val.decode())

def convert_timestamp(val):
    """Преобразует метку времени Unix (эпоха) в объект datetime.datetime."""
    return datetime.datetime.fromtimestamp(int(val))

sqlite3.register_converter("date", convert_date)
sqlite3.register_converter("datetime", convert_datetime)
sqlite3.register_converter("timestamp", convert_timestamp)

Как использовать сокращенные методы соединенияHow to use connection shortcut methods

Используя методы execute(), executemany() и executescript() класса Connection, можно писать код более кратко, поскольку не нужно явно создавать (часто излишние) объекты Cursor. Вместо этого объекты Cursor создаются неявно, и эти сокращенные методы возвращают объекты курсора. Таким образом, можно выполнить оператор SELECT и сразу перебирать его результаты, используя всего один вызов на объекте Connection.

# Создаёт и заполняет таблицу.
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)

# Выводит содержимое таблицы.
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() не является сокращённым методом и не вызывается автоматически.
# Объект соединения следует закрывать вручную.
con.close()

Как использовать менеджер контекста соединенияHow to use the connection context manager

Объект Connection можно использовать как контекстный менеджер, который автоматически фиксирует или откатывает открытые транзакции при выходе из тела контекстного менеджера. Если тело оператора with завершается без исключений, транзакция фиксируется. Если эта фиксация не удалась или тело оператора with возбуждает необработанное исключение, транзакция откатывается.

Если при выходе из тела оператора with нет открытой транзакции, контекстный менеджер ничего не делает.

Примечание

Менеджер контекста не открывает неявно новую транзакцию и не закрывает соединение.

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)")

# При успешном выполнении con.commit() вызывается автоматически.
with con:
    con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))

# con.rollback() вызывается после завершения блока with с исключением,
# исключение по-прежнему возбуждается и должно быть перехвачено.
try:
    with con:
        con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))
except sqlite3.IntegrityError:
    print("couldn't add Python twice")

# Объект Connection, используемый как контекстный менеджер, только фиксирует или откатывает транзакции,
# поэтому объект соединения следует закрывать вручную.
con.close()

Как работать с SQLite URIHow to work with SQLite URIs

Некоторые полезные приёмы работы с 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
  • Не создавать неявно новый файл базы данных, если он ещё не существует; будет вызвано исключение 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,)

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

Как создавать и использовать фабрики строкHow to create and use row factories

По умолчанию 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]         # Доступ по индексу.
'Earth'
>>> row["name"]    # Доступ по имени.
'Earth'
>>> row["RADIUS"]  # Имена столбцов нечувствительны к регистру.
6378

Можно создать собственную 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}

Следующая фабрика строк возвращает именованный кортеж:

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]  # Индексный доступ.
1
>>> row.b   # Доступ через атрибут.
2

С некоторыми изменениями приведённый рецепт можно адаптировать для использования dataclass или любого другого пользовательского класса вместо namedtuple.

ПояснениеExplanation

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

Модуль sqlite3 не придерживается обработки транзакций, рекомендуемой PEP 249.

Если атрибут соединения isolation_level не равен None, новые транзакции неявно открываются перед тем, как execute() и executemany() выполняют INSERT, UPDATE, DELETE или REPLACE операторы; для других операторов неявная обработка транзакций не выполняется. Используйте методы commit() и rollback() для фиксации и отката ожидающих транзакций соответственно. Можно выбрать базовое поведение транзакций SQLite – то есть, будут ли и какого типа BEGIN операторы sqlite3 выполняет неявно – через атрибут isolation_level.

Если isolation_level установлен в None, транзакции вообще не открываются неявно. Это оставляет базовую библиотеку SQLite в режиме автокоммита, но также позволяет пользователю выполнять собственную обработку транзакций с помощью явных SQL-операторов. Режим автокоммита базовой библиотеки SQLite можно запросить с помощью атрибута in_transaction.

Метод executescript() неявно фиксирует любую ожидающую транзакцию перед выполнением данного SQL-скрипта, независимо от значения isolation_level.

Изменено в версии 3.6: sqlite3 ранее неявно фиксировал открытую транзакцию перед DDL операторами. Теперь это не так.