sqlite3.md
1> **Источник:** https://python-all.ru/3.6/library/sqlite3.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 12.6. [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) – интерфейс DB-API 2.0 для баз данных SQLite89**Исходный код:** [Lib/sqlite3/](https://python-all.ru/src/3.6/Lib/sqlite3)1011---1213SQLite – это библиотека на C, которая предоставляет легковесную дисковую базу данных, не требующую отдельного серверного процесса, и позволяет обращаться к базе данных с помощью нестандартного варианта языка SQL. Некоторые приложения могут использовать SQLite для внутреннего хранения данных. Также можно создать прототип приложения на SQLite, а затем перенести код на более крупную базу данных, например PostgreSQL или Oracle.1415Модуль sqlite3 написан Герхардом Харингом. Он предоставляет SQL-интерфейс, соответствующий спецификации DB-API 2.0, описанной в [**PEP 249**](https://python-all.ru/3.6/library/sqlite3.html).1617Чтобы использовать модуль, сначала необходимо создать объект [`Connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection), который представляет базу данных. Здесь данные будут храниться в файле `example.db`:1819```python20import sqlite321conn = sqlite3.connect('example.db')22```2324Также можно указать специальное имя `:memory:` для создания базы данных в оперативной памяти.2526После получения [`Connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection) можно создать объект [`Cursor`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor) и вызвать его метод [`execute()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.execute) для выполнения SQL-команд:2728```python29c = conn.cursor()3031# Создать таблицу32c.execute('''CREATE TABLE stocks33 (date text, trans text, symbol text, qty real, price real)''')3435# Вставить строку данных36c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")3738# Сохранить (зафиксировать) изменения39conn.commit()4041# Также можно закрыть соединение, если работа с ним завершена.42# Все изменения должны быть зафиксированы, иначе они будут потеряны.43conn.close()44```4546Сохранённые данные являются постоянными и доступны в последующих сеансах:4748```python49import sqlite350conn = sqlite3.connect('example.db')51c = conn.cursor()52```5354Обычно в SQL-операциях требуется использовать значения из переменных Python. Не следует собирать запрос с помощью строковых операций Python, потому что это небезопасно; это делает программу уязвимой для атак SQL-инъекций (см. [https://xkcd.com/327/](https://python-all.ru/3.6/library/sqlite3.html) – забавный пример того, что может пойти не так).5556Вместо этого используется подстановка параметров DB-API. `?` ставится в качестве заполнителя там, где требуется значение, после чего кортеж значений передаётся вторым аргументом методу [`execute()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.execute) курсора. (Другие модули баз данных могут использовать другой заполнитель, например `%s` или `:1`.) Например:5758```python59# Никогда не делайте этого – это небезопасно!60symbol = 'RHAT'61c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)6263# Вместо этого сделайте так64t = ('RHAT',)65c.execute('SELECT * FROM stocks WHERE symbol=?', t)66print(c.fetchone())6768# Более крупный пример, вставляющий много записей за один раз69purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),70 ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),71 ('2006-04-06', 'SELL', 'IBM', 500, 53.00),72 ]73c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)74```7576Чтобы получить данные после выполнения запроса SELECT, можно либо рассматривать курсор как [итератор](https://python-all.ru/3.6/glossary.html#term-iterator), вызвать метод [`fetchone()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.fetchone) курсора для получения одной подходящей строки, либо вызвать [`fetchall()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.fetchall) для получения списка подходящих строк.7778В этом примере используется форма итератора:7980```python81>>> for row in c.execute('SELECT * FROM stocks ORDER BY price'):82 print(row)8384('2006-01-05', 'BUY', 'RHAT', 100, 35.14)85('2006-03-28', 'BUY', 'IBM', 1000, 45.0)86('2006-04-06', 'SELL', 'IBM', 500, 53.0)87('2006-04-05', 'BUY', 'MSFT', 1000, 72.0)88```8990> **См. также**91>92> **[https://github.com/ghaering/pysqlite](https://python-all.ru/3.6/library/sqlite3.html)**93>94> Страница pysqlite – sqlite3 разрабатывается отдельно под названием «pysqlite».95>96> **[https://www.sqlite.org](https://python-all.ru/3.6/library/sqlite3.html)**97>98> Веб-страница SQLite; документация описывает синтаксис и доступные типы данных поддерживаемого диалекта SQL.99>100> **[http://www.w3schools.com/sql/](https://python-all.ru/3.6/library/sqlite3.html)**101>102> Учебные материалы, справочник и примеры для изучения синтаксиса SQL.103>104> **[**PEP 249**](https://python-all.ru/3.6/library/sqlite3.html) – спецификация API баз данных 2.0**105>106> PEP написан Марком-Андре Лембургом.107108## 12.6.1. Функции и константы модуля109110#### `sqlite3.version`111112Номер версии этого модуля в виде строки. Это не версия библиотеки SQLite.113114#### `sqlite3.version_info`115116Номер версии этого модуля в виде кортежа целых чисел. Это не версия библиотеки SQLite.117118#### `sqlite3.sqlite_version`119120Номер версии библиотеки SQLite времени выполнения в виде строки.121122#### `sqlite3.sqlite_version_info`123124Номер версии библиотеки SQLite времени выполнения в виде кортежа целых чисел.125126#### `sqlite3.PARSE_DECLTYPES`127128Эта константа предназначена для использования с параметром *detect\_types* функции [`connect()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.connect).129130Установка этого флага заставляет модуль [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) анализировать объявленный тип для каждого возвращаемого столбца. Он выделит первое слово объявленного типа, т. е. для «integer primary key» выделит «integer», а для «number(10)» выделит «number». Затем для этого столбца он заглянет в словарь преобразователей и использует зарегистрированную там функцию преобразования для этого типа.131132#### `sqlite3.PARSE_COLNAMES`133134Эта константа предназначена для использования с параметром *detect\_types* функции [`connect()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.connect).135136Установка этого параметра заставляет интерфейс SQLite разбирать имена столбцов для каждого столбца, который он возвращает. Он будет искать строку вида \[mytype\] и на основании этого определять, что 'mytype' – это тип столбца. Затем он попытается найти запись 'mytype' в словаре конвертеров и использовать найденную функцию-конвертер для возврата значения. Имя столбца, найденное в [`Cursor.description`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.description), – это только первое слово имени столбца; то есть если используется что-то вроде `'as "x [datetime]"'` в SQL, то будет извлечено всё до первого пробела: именем столбца будет просто "x".137138#### `sqlite3.connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri])`139140Открывает соединение с файлом базы данных SQLite *database*. Можно использовать `":memory:"` для открытия соединения с базой данных, которая находится в оперативной памяти, вместо файла на диске.141142Когда к базе данных обращаются несколько соединений и один из процессов изменяет базу данных, база данных SQLite блокируется до завершения этой транзакции. Параметр *timeout* задаёт, как долго соединение должно ждать снятия блокировки, прежде чем возникнет исключение. Значение по умолчанию для параметра timeout – 5.0 (пять секунд).143144По поводу параметра *isolation\_level* обратитесь к свойству [`isolation_level`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.isolation_level) объектов [`Connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection).145146SQLite изначально поддерживает только типы TEXT, INTEGER, REAL, BLOB и NULL. Если вы хотите использовать другие типы, необходимо добавить поддержку самостоятельно. Параметр *detect\_types* и использование пользовательских **преобразователей**, зарегистрированных с помощью функции модуля [`register_converter()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.register_converter), позволяют легко это сделать.147148*detect\_types* по умолчанию равен 0 (т.е. выключен, определение типов не выполняется). Вы можете установить его в любую комбинацию [`PARSE_DECLTYPES`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.PARSE_DECLTYPES) и [`PARSE_COLNAMES`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.PARSE_COLNAMES), чтобы включить определение типов.149150По умолчанию *check\_same\_thread* равен [`True`](https://python-all.ru/3.6/library/constants.html#True), и только создавший поток может использовать соединение. Если установлено [`False`](https://python-all.ru/3.6/library/constants.html#False), возвращаемое соединение может использоваться несколькими потоками. При использовании нескольких потоков с одним соединением операции записи должны быть сериализованы пользователем во избежание повреждения данных.151152По умолчанию модуль [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) использует свой класс [`Connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection) для вызова connect. Однако вы можете создать подкласс класса [`Connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection) и заставить [`connect()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.connect) использовать ваш класс, передав его в параметре *factory*.153154Подробности см. в разделе [Типы SQLite и Python](https://python-all.ru/3.6/library/sqlite3.html#sqlite3-types) данного руководства.155156Модуль [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) внутренне использует кэш операторов для снижения накладных расходов на разбор SQL. Если вы хотите явно задать количество операторов, кэшируемых для соединения, можно установить параметр *cached\_statements*. Текущая реализация по умолчанию кэширует 100 операторов.157158Если *uri* равно true, *database* интерпретируется как URI. Это позволяет задавать параметры. Например, чтобы открыть базу данных в режиме только для чтения, можно использовать:159160```python161db = sqlite3.connect('file:path/to/database?mode=ro', uri=True)162```163164Дополнительную информацию об этой возможности, включая список распознаваемых параметров, можно найти в [документации SQLite URI](https://python-all.ru/3.6/library/sqlite3.html).165166Изменено в версии 3.4: Добавлен параметр *uri*.167168#### `sqlite3.register_converter(typename, callable)`169170Регистрирует вызываемый объект для преобразования байтовой строки из базы данных в пользовательский тип Python. Вызываемый объект будет вызываться для всех значений базы данных, имеющих тип *typename*. Смотрите параметр *detect\_types* функции [`connect()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.connect), чтобы узнать, как работает определение типа. Обратите внимание, что *typename* и имя типа в запросе сравниваются без учёта регистра.171172#### `sqlite3.register_adapter(type, callable)`173174Регистрирует вызываемый объект для преобразования пользовательского типа Python *type* в один из поддерживаемых типов SQLite. Вызываемый объект *callable* принимает в качестве единственного параметра значение Python и должен возвращать значение одного из следующих типов: int, float, str или bytes.175176#### `sqlite3.complete_statement(sql)`177178Возвращает [`True`](https://python-all.ru/3.6/library/constants.html#True), если строка *sql* содержит одно или несколько полных SQL-выражений, завершающихся точкой с запятой. При этом не проверяется синтаксическая корректность SQL, только отсутствие незакрытых строковых литералов и завершение выражения точкой с запятой.179180Это можно использовать для создания оболочки для SQLite, как в следующем примере:181182```python183# Минимальная оболочка SQLite для экспериментов184185import sqlite3186187con = sqlite3.connect(":memory:")188con.isolation_level = None189cur = con.cursor()190191buffer = ""192193print("Enter your SQL commands to execute in sqlite3.")194print("Enter a blank line to exit.")195196while True:197 line = input()198 if line == "":199 break200 buffer += line201 if sqlite3.complete_statement(buffer):202 try:203 buffer = buffer.strip()204 cur.execute(buffer)205206 if buffer.lstrip().upper().startswith("SELECT"):207 print(cur.fetchall())208 except sqlite3.Error as e:209 print("An error occurred:", e.args[0])210 buffer = ""211212con.close()213```214215#### `sqlite3.enable_callback_tracebacks(flag)`216217По умолчанию трассировки не отображаются для пользовательских функций, агрегатов, преобразователей, колбэков авторизатора и т.д. Для отладки можно вызвать эту функцию, установив для *flag* значение `True`. После этого трассировки будут отображаться из колбэков на `sys.stderr`. Используйте [`False`](https://python-all.ru/3.6/library/constants.html#False), чтобы снова отключить эту возможность.218219## 12.6.2. Объекты соединений220221#### `class sqlite3.Connection`222223Соединение с базой данных SQLite обладает следующими атрибутами и методами:224225#### `isolation_level`226227Получает или устанавливает текущий уровень изоляции по умолчанию. [`None`](https://python-all.ru/3.6/library/constants.html#None) для режима автокоммита или одно из значений «DEFERRED», «IMMEDIATE» или «EXCLUSIVE». Смотрите раздел [Управление транзакциями](https://python-all.ru/3.6/library/sqlite3.html#sqlite3-controlling-transactions) для более подробного объяснения.228229#### `in_transaction`230231[`True`](https://python-all.ru/3.6/library/constants.html#True), если транзакция активна (есть незафиксированные изменения), иначе [`False`](https://python-all.ru/3.6/library/constants.html#False). Атрибут только для чтения.232233Новое в версии 3.2.234235#### `cursor(factory=Cursor)`236237Метод cursor принимает один необязательный параметр *factory*. Если он указан, это должен быть вызываемый объект, возвращающий экземпляр [`Cursor`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor) или его подклассов.238239#### `commit()`240241Этот метод фиксирует текущую транзакцию. Если не вызвать этот метод, все изменения, сделанные после последнего вызова `commit()`, не будут видны из других подключений к базе данных. Если вы не видите данные, которые записали в базу, проверьте, не забыли ли вызвать этот метод.242243#### `rollback()`244245Этот метод откатывает все изменения в базе данных, сделанные после последнего вызова [`commit()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.commit).246247#### `close()`248249Это закрывает подключение к базе данных. Обратите внимание, что это не вызывает автоматически [`commit()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.commit). Если просто закрыть подключение к базе данных, не вызвав предварительно [`commit()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.commit), изменения будут потеряны!250251#### `execute(sql[, parameters])`252253Это нестандартное сокращение, которое создаёт объект курсора вызовом метода [`cursor()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.cursor), затем вызывает метод [`execute()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.execute) курсора с переданными *параметрами* и возвращает курсор.254255#### `executemany(sql[, parameters])`256257Это нестандартное сокращение, которое создаёт объект курсора вызовом метода [`cursor()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.cursor), затем вызывает метод [`executemany()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.executemany) курсора с переданными *параметрами* и возвращает курсор.258259#### `executescript(sql_script)`260261Это нестандартное сокращение, которое создаёт объект курсора вызовом метода [`cursor()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.cursor), затем вызывает метод [`executescript()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.executescript) курсора с переданным *sql\_script* и возвращает курсор.262263#### `create_function(name, num_params, func)`264265Создаёт пользовательскую функцию, которую затем можно использовать в SQL-выражениях под именем функции *name*. *num\_params* – количество параметров, которые принимает функция (если *num\_params* равно -1, функция может принимать любое количество аргументов), а *func* – это вызываемый объект Python, который вызывается как SQL-функция.266267Функция может возвращать любой из типов, поддерживаемых SQLite: bytes, str, int, float и `None`.268269Пример:270271```python272import sqlite3273import hashlib274275def md5sum(t):276 return hashlib.md5(t).hexdigest()277278con = sqlite3.connect(":memory:")279con.create_function("md5", 1, md5sum)280cur = con.cursor()281cur.execute("select md5(?)", (b"foo",))282print(cur.fetchone()[0])283```284285#### `create_aggregate(name, num_params, aggregate_class)`286287Создаёт пользовательскую агрегатную функцию.288289Класс агрегата должен реализовывать метод `step`, который принимает количество параметров *num\_params* (если *num\_params* равно -1, функция может принимать любое количество аргументов), и метод `finalize`, который возвращает окончательный результат агрегата.290291Метод `finalize` может возвращать любой из типов, поддерживаемых SQLite: bytes, str, int, float и `None`.292293Пример:294295```python296import sqlite3297298class MySum:299 def __init__(self):300 self.count = 0301302 def step(self, value):303 self.count += value304305 def finalize(self):306 return self.count307308con = sqlite3.connect(":memory:")309con.create_aggregate("mysum", 1, MySum)310cur = con.cursor()311cur.execute("create table test(i)")312cur.execute("insert into test(i) values (1)")313cur.execute("insert into test(i) values (2)")314cur.execute("select mysum(i) from test")315print(cur.fetchone()[0])316```317318#### `create_collation(name, callable)`319320Создаёт collation с указанными *name* и *callable*. Вызываемый объект будет получать два строковых аргумента. Он должен возвращать -1, если первый меньше второго, 0, если они равны, и 1, если первый больше второго. Обратите внимание, что это управляет сортировкой (ORDER BY в SQL), поэтому сравнения не влияют на другие операции SQL.321322Обратите внимание, что вызываемый объект будет получать свои параметры в виде байтовых строк Python, которые обычно закодированы в UTF-8.323324Следующий пример показывает пользовательскую коллацию, которая сортирует «в обратном порядке»:325326```python327import sqlite3328329def collate_reverse(string1, string2):330 if string1 == string2:331 return 0332 elif string1 < string2:333 return 1334 else:335 return -1336337con = sqlite3.connect(":memory:")338con.create_collation("reverse", collate_reverse)339340cur = con.cursor()341cur.execute("create table test(x)")342cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])343cur.execute("select x from test order by x collate reverse")344for row in cur:345 print(row)346con.close()347```348349Чтобы удалить коллацию, вызовите `create_collation` с `None` в качестве вызываемого объекта:350351```python352con.create_collation("reverse", None)353```354355#### `interrupt()`356357Этот метод можно вызвать из другого потока, чтобы прервать любые запросы, которые могут выполняться в подключении. Запрос будет прерван, а вызывающий код получит исключение.358359#### `set_authorizer(authorizer_callback)`360361Эта процедура регистрирует колбэк. Колбэк вызывается при каждой попытке доступа к столбцу таблицы в базе данных. Колбэк должен возвращать `SQLITE_OK`, если доступ разрешён, `SQLITE_DENY`, если весь SQL-запрос должен быть прерван с ошибкой, и `SQLITE_IGNORE`, если столбец должен рассматриваться как значение NULL. Эти константы доступны в модуле [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3).362363Первый аргумент колбэка указывает, какой тип операции требуется авторизовать. Второй и третий аргументы будут аргументами или [`None`](https://python-all.ru/3.6/library/constants.html#None) в зависимости от первого аргумента. Четвёртый аргумент – имя базы данных («main», «temp» и т.д.), если применимо. Пятый аргумент – имя самого внутреннего триггера или представления, ответственного за попытку доступа, или [`None`](https://python-all.ru/3.6/library/constants.html#None), если эта попытка доступа происходит непосредственно из входного SQL-кода.364365Обратитесь к документации SQLite за возможными значениями первого аргумента и значением второго и третьего аргументов в зависимости от первого. Все необходимые константы доступны в модуле [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3).366367#### `set_progress_handler(handler, n)`368369Эта процедура регистрирует колбэк. Колбэк вызывается каждые *n* инструкций виртуальной машины SQLite. Это полезно, если требуется получать вызовы от SQLite во время длительных операций, например для обновления графического интерфейса.370371Чтобы очистить ранее установленный обработчик прогресса, вызовите метод с [`None`](https://python-all.ru/3.6/library/constants.html#None) для *handler*.372373Возврат ненулевого значения из функции-обработчика завершит выполняющийся запрос и вызовет исключение [`OperationalError`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.OperationalError).374375#### `set_trace_callback(trace_callback)`376377Регистрирует *trace\_callback*, который будет вызываться для каждого SQL-выражения, фактически выполняемого серверной частью SQLite.378379Единственный аргумент, передаваемый колбэку, – это выполняемый оператор (в виде строки). Возвращаемое значение колбэка игнорируется. Обратите внимание, что бэкенд выполняет не только операторы, переданные методам [`Cursor.execute()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.execute). Другие источники включают управление транзакциями модуля Python и выполнение триггеров, определённых в текущей базе данных.380381Передача [`None`](https://python-all.ru/3.6/library/constants.html#None) в качестве *trace\_callback* отключает трассировочный колбэк.382383Новое в версии 3.3.384385#### `enable_load_extension(enabled)`386387Эта процедура разрешает или запрещает механизму SQLite загружать расширения SQLite из разделяемых библиотек. Расширения SQLite могут определять новые функции, агрегатные функции или целые реализации виртуальных таблиц. Одним из известных расширений является расширение полнотекстового поиска, распространяемое с SQLite.388389Загружаемые расширения по умолчанию отключены. См. [1](https://python-all.ru/3.6/library/sqlite3.html#f1).390391Новое в версии 3.2.392393```python394import sqlite3395396con = sqlite3.connect(":memory:")397398# включить загрузку расширений399con.enable_load_extension(True)400401# Загрузить расширение полнотекстового поиска.402con.execute("select load_extension('./fts3.so')")403404# в качестве альтернативы можно загрузить расширение с помощью вызова API:405# con.load_extension("./fts3.so")406407# отключить загрузку расширения снова408con.enable_load_extension(False)409410# пример из вики SQLite411con.execute("create virtual table recipe using fts3(name, ingredients)")412con.executescript("""413 insert into recipe (name, ingredients) values ('broccoli stew', 'broccoli peppers cheese tomatoes');414 insert into recipe (name, ingredients) values ('pumpkin stew', 'pumpkin onions garlic celery');415 insert into recipe (name, ingredients) values ('broccoli pie', 'broccoli cheese onions flour');416 insert into recipe (name, ingredients) values ('pumpkin pie', 'pumpkin sugar flour butter');417 """)418for row in con.execute("select rowid, name, ingredients from recipe where name match 'pie'"):419 print(row)420```421422#### `load_extension(path)`423424Эта процедура загружает расширение SQLite из разделяемой библиотеки. Перед использованием этой процедуры необходимо включить загрузку расширений с помощью [`enable_load_extension()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.enable_load_extension).425426Загружаемые расширения по умолчанию отключены. См. [1](https://python-all.ru/3.6/library/sqlite3.html#f1).427428Новое в версии 3.2.429430#### `row_factory`431432Этот атрибут можно заменить на вызываемый объект, который принимает курсор и исходную строку в виде кортежа и возвращает реальную результирующую строку. Таким образом можно реализовать более продвинутые способы возврата результатов, например возврат объекта, который также может обращаться к столбцам по имени.433434Пример:435436```python437import sqlite3438439def dict_factory(cursor, row):440 d = {}441 for idx, col in enumerate(cursor.description):442 d[col[0]] = row[idx]443 return d444445con = sqlite3.connect(":memory:")446con.row_factory = dict_factory447cur = con.cursor()448cur.execute("select 1 as a")449print(cur.fetchone()["a"])450```451452Если возврата кортежа недостаточно и требуется доступ к столбцам по имени, рассмотрите возможность установки [`row_factory`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.row_factory) в высокооптимизированный тип [`sqlite3.Row`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Row). [`Row`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Row) обеспечивает как доступ по индексу, так и регистронезависимый доступ по имени с почти нулевыми накладными расходами памяти. Вероятно, это будет лучше, чем собственное решение на основе словаря или даже на основе db\_row.453454#### `text_factory`455456С помощью этого атрибута можно управлять тем, какие объекты возвращаются для типа данных `TEXT`. По умолчанию этот атрибут имеет значение [`str`](https://python-all.ru/3.6/library/stdtypes.html#str), и модуль [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) возвращает объекты Unicode для `TEXT`. Если вместо этого нужно возвращать байтовые строки, можно установить значение [`bytes`](https://python-all.ru/3.6/library/stdtypes.html#bytes).457458Также можно установить его в любой другой вызываемый объект, принимающий единственный параметр – байтовую строку и возвращающий результирующий объект.459460См. следующий пример для иллюстрации:461462```python463import sqlite3464465con = sqlite3.connect(":memory:")466cur = con.cursor()467468AUSTRIA = "\xd6sterreich"469470# по умолчанию строки возвращаются как Unicode471cur.execute("select ?", (AUSTRIA,))472row = cur.fetchone()473assert row[0] == AUSTRIA474475# но можно заставить sqlite3 всегда возвращать байтовые строки...476con.text_factory = bytes477cur.execute("select ?", (AUSTRIA,))478row = cur.fetchone()479assert type(row[0]) is bytes480# байтовые строки будут в кодировке UTF-8, если только в базу не попал мусор481# база данных...482assert row[0] == AUSTRIA.encode("utf-8")483484# можно также реализовать собственный text_factory...485# здесь реализован такой, который добавляет "foo" ко всем строкам486con.text_factory = lambda x: x.decode("utf-8") + "foo"487cur.execute("select ?", ("bar",))488row = cur.fetchone()489assert row[0] == "barfoo"490```491492#### `total_changes`493494Возвращает общее количество строк базы данных, которые были изменены, вставлены или удалены с момента открытия подключения к базе данных.495496#### `iterdump()`497498Возвращает итератор для дампа базы данных в текстовом формате SQL. Полезно при сохранении базы данных в памяти для последующего восстановления. Эта функция предоставляет те же возможности, что и команда `.dump` в оболочке **sqlite3**.499500Пример:501502```python503# Преобразовать файл existing_db.db в SQL-дамп dump.sql504import sqlite3505506con = sqlite3.connect('existing_db.db')507with open('dump.sql', 'w') as f:508 for line in con.iterdump():509 f.write('%s\n' % line)510```511512## 12.6.3. Объекты курсора513514#### `class sqlite3.Cursor`515516Экземпляр [`Cursor`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor) имеет следующие атрибуты и методы.517518#### `execute(sql[, parameters])`519520Выполняет SQL-выражение. SQL-выражение может быть параметризованным (т. е. с использованием плейсхолдеров вместо литералов SQL). Модуль [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) поддерживает два вида плейсхолдеров: вопросительные знаки (стиль qmark) и именованные плейсхолдеры (именованный стиль).521522Вот пример обоих стилей:523524```python525import sqlite3526527con = sqlite3.connect(":memory:")528cur = con.cursor()529cur.execute("create table people (name_last, age)")530531who = "Yeltsin"532age = 72533534# Это стиль qmark:535cur.execute("insert into people values (?, ?)", (who, age))536537# А это именованный стиль:538cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})539540print(cur.fetchone())541```542543[`execute()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.execute) выполняет только одно SQL-выражение. При попытке выполнить с его помощью несколько выражений будет вызвано исключение [`Warning`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Warning). Используйте [`executescript()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.executescript), если нужно выполнить несколько SQL-выражений одним вызовом.544545#### `executemany(sql, seq_of_parameters)`546547Выполняет SQL-команду для всех последовательностей параметров или отображений, найденных в последовательности *seq\_of\_parameters*. Модуль [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) также позволяет использовать [итератор](https://python-all.ru/3.6/glossary.html#term-iterator), возвращающий параметры, вместо последовательности.548549```python550import sqlite3551552class IterChars:553 def __init__(self):554 self.count = ord('a')555556 def __iter__(self):557 return self558559 def __next__(self):560 if self.count > ord('z'):561 raise StopIteration562 self.count += 1563 return (chr(self.count - 1),) # это кортеж из одного элемента564565con = sqlite3.connect(":memory:")566cur = con.cursor()567cur.execute("create table characters(c)")568569theIter = IterChars()570cur.executemany("insert into characters(c) values (?)", theIter)571572cur.execute("select c from characters")573print(cur.fetchall())574```575576Вот более короткий пример с использованием [генератора](https://python-all.ru/3.6/glossary.html#term-generator):577578```python579import sqlite3580import string581582def char_generator():583 for c in string.ascii_lowercase:584 yield (c,)585586con = sqlite3.connect(":memory:")587cur = con.cursor()588cur.execute("create table characters(c)")589590cur.executemany("insert into characters(c) values (?)", char_generator())591592cur.execute("select c from characters")593print(cur.fetchall())594```595596#### `executescript(sql_script)`597598Это нестандартный удобный метод для выполнения нескольких SQL-выражений за один раз. Сначала он выполняет оператор `COMMIT`, а затем выполняет SQL-скрипт, переданный в качестве параметра.599600*sql\_script* может быть экземпляром [`str`](https://python-all.ru/3.6/library/stdtypes.html#str).601602Пример:603604```python605import sqlite3606607con = sqlite3.connect(":memory:")608cur = con.cursor()609cur.executescript("""610 create table person(611 firstname,612 lastname,613 age614 );615616 create table book(617 title,618 author,619 published620 );621622 insert into book(title, author, published)623 values (624 'Dirk Gently''s Holistic Detective Agency',625 'Douglas Adams',626 1987627 );628 """)629```630631#### `fetchone()`632633Извлекает следующую строку результата запроса, возвращая одну последовательность или [`None`](https://python-all.ru/3.6/library/constants.html#None), если данные закончились.634635#### `fetchmany(size=cursor.arraysize)`636637Извлекает следующий набор строк результата запроса, возвращая список. Пустой список возвращается, когда строк больше нет.638639Количество строк, извлекаемых за один вызов, задаётся параметром *size*. Если он не указан, количество строк определяется атрибутом arraysize курсора. Метод должен пытаться извлечь столько строк, сколько указано параметром size. Если это невозможно из-за того, что указанное количество строк недоступно, может быть возвращено меньше строк.640641Обратите внимание, что параметр *size* связан с производительностью. Для оптимальной производительности обычно лучше использовать атрибут arraysize. Если используется параметр *size*, рекомендуется сохранять одно и то же значение от одного вызова [`fetchmany()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.fetchmany) к следующему.642643#### `fetchall()`644645Извлекает все (оставшиеся) строки результата запроса, возвращая список. Обратите внимание, что атрибут arraysize курсора может влиять на производительность этой операции. Пустой список возвращается, если строк нет.646647#### `close()`648649Закрывает курсор сейчас (а не при вызове `__del__`).650651Курсор станет непригодным к использованию; будет выброшено исключение [`ProgrammingError`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.ProgrammingError) при любой попытке выполнить операцию с курсором.652653#### `rowcount`654655Хотя класс [`Cursor`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor) модуля [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) реализует этот атрибут, собственная поддержка определения «затронутых строк»/«выбранных строк» в движке базы данных работает непредсказуемо.656657Для выражений [`executemany()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.executemany) количество изменений суммируется в [`rowcount`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.rowcount).658659В соответствии со спецификацией Python DB API, атрибут [`rowcount`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.rowcount) «равен -1, если над курсором не выполнялось `executeXX()` или количество строк последней операции не может быть определено интерфейсом». Это включает выражения `SELECT`, потому что количество строк, полученных запросом, нельзя определить, пока не будут извлечены все строки.660661В SQLite версий до 3.6.5 [`rowcount`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.rowcount) устанавливается в 0, если выполнить `DELETE FROM table` без условия.662663#### `lastrowid`664665Этот атрибут только для чтения возвращает rowid последней измененной строки. Он устанавливается только при выполнении оператора `INSERT` или `REPLACE` с использованием метода [`execute()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.execute). Для операций, отличных от `INSERT` или `REPLACE`, или при вызове [`executemany()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.executemany), [`lastrowid`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.lastrowid) устанавливается в [`None`](https://python-all.ru/3.6/library/constants.html#None).666667Если оператору `INSERT` или `REPLACE` не удалось выполнить вставку, возвращается rowid предыдущей успешной вставки.668669Изменено в версии 3.6: Добавлена поддержка оператора `REPLACE`.670671#### `arraysize`672673Атрибут чтения/записи, управляющий количеством строк, возвращаемых [`fetchmany()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.fetchmany). Значение по умолчанию – 1, то есть при каждом вызове будет извлечена одна строка.674675#### `description`676677Этот атрибут только для чтения содержит имена столбцов последнего запроса. Для совместимости с Python DB API он возвращает 7-кортеж для каждого столбца, где последние шесть элементов каждого кортежа равны [`None`](https://python-all.ru/3.6/library/constants.html#None).678679Он также устанавливается для операторов `SELECT`, не имеющих подходящих строк.680681#### `connection`682683Этот атрибут только для чтения предоставляет [`Connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection) базы данных SQLite, используемый объектом [`Cursor`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor). Объект [`Cursor`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor), созданный вызовом [`con.cursor()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.cursor), будет иметь атрибут [`connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.connection), ссылающийся на *con*:684685```python686>>> con = sqlite3.connect(":memory:")687>>> cur = con.cursor()688>>> cur.connection == con689True690```691692## 12.6.4. Объекты строк693694#### `class sqlite3.Row`695696Экземпляр [`Row`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Row) служит высокооптимизированной [`row_factory`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.row_factory) для объектов [`Connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection). Он старается имитировать кортеж в большинстве своих возможностей.697698Он поддерживает доступ по имени столбца и индексу, итерацию, представление, проверку равенства и [`len()`](https://python-all.ru/3.6/library/functions.html#len).699700Если два объекта [`Row`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Row) имеют одинаковые столбцы и их члены равны, они считаются равными.701702#### `keys()`703704Этот метод возвращает список имён столбцов. Сразу после запроса это первый элемент каждого кортежа в [`Cursor.description`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor.description).705706Изменено в версии 3.5: Добавлена поддержка срезов.707708Предположим, мы инициализируем таблицу, как в приведённом выше примере:709710```python711conn = sqlite3.connect(":memory:")712c = conn.cursor()713c.execute('''create table stocks714(date text, trans text, symbol text,715 qty real, price real)''')716c.execute("""insert into stocks717 values ('2006-01-05','BUY','RHAT',100,35.14)""")718conn.commit()719c.close()720```721722Теперь подключаем [`Row`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Row):723724```python725>>> conn.row_factory = sqlite3.Row726>>> c = conn.cursor()727>>> c.execute('select * from stocks')728<sqlite3.Cursor object at 0x7f4e7dd8fa80>729>>> r = c.fetchone()730>>> type(r)731<class 'sqlite3.Row'>732>>> tuple(r)733('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14)734>>> len(r)7355736>>> r[2]737'RHAT'738>>> r.keys()739['date', 'trans', 'symbol', 'qty', 'price']740>>> r['qty']741100.0742>>> for member in r:743... print(member)744...7452006-01-05746BUY747RHAT748100.074935.14750```751752## 12.6.5. Исключения753754#### `exception sqlite3.Warning`755756Подкласс [`Exception`](https://python-all.ru/3.6/library/exceptions.html#Exception).757758#### `exception sqlite3.Error`759760Базовый класс остальных исключений в этом модуле. Он является подклассом [`Exception`](https://python-all.ru/3.6/library/exceptions.html#Exception).761762#### `exception sqlite3.DatabaseError`763764Исключение, вызываемое для ошибок, связанных с базой данных.765766#### `exception sqlite3.IntegrityError`767768Исключение возникает при нарушении реляционной целостности базы данных, например, при неудачной проверке внешнего ключа. Оно является подклассом [`DatabaseError`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.DatabaseError).769770#### `exception sqlite3.ProgrammingError`771772Исключение вызывается при ошибках программирования, например, таблица не найдена или уже существует, синтаксическая ошибка в SQL-запросе, указано неверное количество параметров и т.д. Является подклассом [`DatabaseError`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.DatabaseError).773774#### `exception sqlite3.OperationalError`775776Исключение вызывается для ошибок, связанных с работой базы данных и не обязательно находящихся под контролем программиста, например, неожиданное отключение, не найден источник данных, транзакция не могла быть обработана, и т.д. Является подклассом [`DatabaseError`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.DatabaseError).777778#### `exception sqlite3.NotSupportedError`779780Исключение вызывается, если используется метод или API базы данных, который не поддерживается базой данных, например, вызов метода [`rollback()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.rollback) для соединения, которое не поддерживает транзакции или имеет транзакции отключены. Является подклассом [`DatabaseError`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.DatabaseError).781782## 12.6.6. Типы SQLite и Python783784### 12.6.6.1. Введение785786SQLite изначально поддерживает следующие типы: `NULL`, `INTEGER`, `REAL`, `TEXT`, `BLOB`.787788Следующие типы Python можно передавать в SQLite без каких-либо проблем:789790| Тип Python | Тип SQLite |791| --- | --- |792| [`None`](https://python-all.ru/3.6/library/constants.html#None) | `NULL` |793| [`int`](https://python-all.ru/3.6/library/functions.html#int) | `INTEGER` |794| [`float`](https://python-all.ru/3.6/library/functions.html#float) | `REAL` |795| [`str`](https://python-all.ru/3.6/library/stdtypes.html#str) | `TEXT` |796| [`bytes`](https://python-all.ru/3.6/library/stdtypes.html#bytes) | `BLOB` |797798Так по умолчанию типы SQLite преобразуются в типы Python:799800| Тип SQLite | Тип Python |801| --- | --- |802| `NULL` | [`None`](https://python-all.ru/3.6/library/constants.html#None) |803| `INTEGER` | [`int`](https://python-all.ru/3.6/library/functions.html#int) |804| `REAL` | [`float`](https://python-all.ru/3.6/library/functions.html#float) |805| `TEXT` | зависит от [`text_factory`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.text_factory), по умолчанию [`str`](https://python-all.ru/3.6/library/stdtypes.html#str) |806| `BLOB` | [`bytes`](https://python-all.ru/3.6/library/stdtypes.html#bytes) |807808Система типов модуля [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) расширяема двумя способами: можно хранить дополнительные типы Python в базе данных SQLite с помощью адаптации объектов, а также можно позволить модулю [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) преобразовывать типы SQLite в различные типы Python с помощью конвертеров.809810### 12.6.6.2. Использование адаптеров для хранения дополнительных типов Python в базах данных SQLite811812Как описывалось ранее, SQLite изначально поддерживает только ограниченный набор типов. Чтобы использовать другие типы Python с SQLite, необходимо **адаптировать** их к одному из поддерживаемых модулем sqlite3 типов для SQLite: NoneType, int, float, str, bytes.813814Существует два способа разрешить модулю [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) адаптировать пользовательский тип Python к одному из поддерживаемых.815816#### 12.6.6.2.1. Самостоятельная адаптация объекта817818Это хороший подход, если вы пишете класс сами. Предположим, у вас есть такой класс:819820```python821class Point:822 def __init__(self, x, y):823 self.x, self.y = x, y824```825826Теперь нужно сохранить точку в одном столбце SQLite. Сначала нужно выбрать один из поддерживаемых типов для представления точки. Давайте просто используем str и разделим координаты точкой с запятой. Затем нужно определить в классе метод `__conform__(self, protocol)`, который должен возвращать преобразованное значение. Параметр *протокол* будет равен `PrepareProtocol`.827828```python829import sqlite3830831class Point:832 def __init__(self, x, y):833 self.x, self.y = x, y834835 def __conform__(self, protocol):836 if protocol is sqlite3.PrepareProtocol:837 return "%f;%f" % (self.x, self.y)838839con = sqlite3.connect(":memory:")840cur = con.cursor()841842p = Point(4.0, -3.2)843cur.execute("select ?", (p,))844print(cur.fetchone()[0])845```846847#### 12.6.6.2.2. Регистрация вызываемого адаптера848849Другой вариант – создать функцию, которая преобразует тип в строковое представление, и зарегистрировать её с помощью [`register_adapter()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.register_adapter).850851```python852import sqlite3853854class Point:855 def __init__(self, x, y):856 self.x, self.y = x, y857858def adapt_point(point):859 return "%f;%f" % (point.x, point.y)860861sqlite3.register_adapter(Point, adapt_point)862863con = sqlite3.connect(":memory:")864cur = con.cursor()865866p = Point(4.0, -3.2)867cur.execute("select ?", (p,))868print(cur.fetchone()[0])869```870871Модуль [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) имеет два адаптера по умолчанию для встроенных типов Python [`datetime.date`](https://python-all.ru/3.6/library/datetime.html#datetime.date) и [`datetime.datetime`](https://python-all.ru/3.6/library/datetime.html#datetime.datetime). Теперь предположим, что мы хотим сохранить объекты [`datetime.datetime`](https://python-all.ru/3.6/library/datetime.html#datetime.datetime) не в формате ISO, а в виде временной метки Unix.872873```python874import sqlite3875import datetime876import time877878def adapt_datetime(ts):879 return time.mktime(ts.timetuple())880881sqlite3.register_adapter(datetime.datetime, adapt_datetime)882883con = sqlite3.connect(":memory:")884cur = con.cursor()885886now = datetime.datetime.now()887cur.execute("select ?", (now,))888print(cur.fetchone()[0])889```890891### 12.6.6.3. Преобразование значений SQLite в пользовательские типы Python892893Написание адаптера позволяет отправлять пользовательские типы Python в SQLite. Но чтобы сделать это действительно полезным, нужно обеспечить обратное преобразование из SQLite в Python.894895Вступают конвертеры.896897Вернемся к классу `Point`. Мы сохраняли координаты x и y, разделенные точкой с запятой, в виде строк в SQLite.898899Сначала определим функцию-конвертер, которая принимает строку в качестве параметра и создает из нее объект `Point`.900901> **Примечание**902>903> Функции-конвертеры **всегда** вызываются с объектом [`bytes`](https://python-all.ru/3.6/library/stdtypes.html#bytes), независимо от того, с каким типом данных значение было отправлено в SQLite.904905```python906def convert_point(s):907 x, y = map(float, s.split(b";"))908 return Point(x, y)909```910911Теперь нужно сообщить модулю [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3), что выбираемые из базы данные на самом деле являются точкой. Есть два способа сделать это:912913- Неявно, через объявленный тип914- Явно, по имени колонки915916Оба способа описаны в разделе [Функции и константы модуля](https://python-all.ru/3.6/library/sqlite3.html#sqlite3-module-contents), в записях для констант [`PARSE_DECLTYPES`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.PARSE_DECLTYPES) и [`PARSE_COLNAMES`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.PARSE_COLNAMES).917918Следующий пример иллюстрирует оба подхода.919920```python921import sqlite3922923class Point:924 def __init__(self, x, y):925 self.x, self.y = x, y926927 def __repr__(self):928 return "(%f;%f)" % (self.x, self.y)929930def adapt_point(point):931 return ("%f;%f" % (point.x, point.y)).encode('ascii')932933def convert_point(s):934 x, y = list(map(float, s.split(b";")))935 return Point(x, y)936937# Зарегистрировать адаптер938sqlite3.register_adapter(Point, adapt_point)939940# Зарегистрировать конвертер941sqlite3.register_converter("point", convert_point)942943p = Point(4.0, -3.2)944945#########################946# 1) Использование объявленных типов947con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)948cur = con.cursor()949cur.execute("create table test(p point)")950951cur.execute("insert into test(p) values (?)", (p,))952cur.execute("select p from test")953print("with declared types:", cur.fetchone()[0])954cur.close()955con.close()956957#######################958# 1) Использование имён столбцов959con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)960cur = con.cursor()961cur.execute("create table test(p)")962963cur.execute("insert into test(p) values (?)", (p,))964cur.execute('select p as "p [point]" from test')965print("with column names:", cur.fetchone()[0])966cur.close()967con.close()968```969970### 12.6.6.4. Адаптеры и конвертеры по умолчанию971972В модуле datetime есть адаптеры по умолчанию для типов date и datetime. Они отправляются в SQLite как даты/временные метки в формате ISO.973974Преобразователи по умолчанию зарегистрированы под именем «date» для [`datetime.date`](https://python-all.ru/3.6/library/datetime.html#datetime.date) и под именем «timestamp» для [`datetime.datetime`](https://python-all.ru/3.6/library/datetime.html#datetime.datetime).975976Таким образом, в большинстве случаев можно использовать даты и временные метки из Python без лишних усилий. Формат адаптеров также совместим с экспериментальными функциями даты/времени SQLite.977978Следующий пример демонстрирует это.979980```python981import sqlite3982import datetime983984con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)985cur = con.cursor()986cur.execute("create table test(d date, ts timestamp)")987988today = datetime.date.today()989now = datetime.datetime.now()990991cur.execute("insert into test(d, ts) values (?, ?)", (today, now))992cur.execute("select d, ts from test")993row = cur.fetchone()994print(today, "=>", row[0], type(row[0]))995print(now, "=>", row[1], type(row[1]))996997cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"')998row = cur.fetchone()999print("current_date", row[0], type(row[0]))1000print("current_timestamp", row[1], type(row[1]))1001```10021003Если временная метка, хранящаяся в SQLite, имеет дробную часть длиннее 6 знаков, её значение будет усечено до микросекундной точности преобразователем временных меток.10041005## 12.6.7. Управление транзакциями10061007Лежащая в основе библиотека `sqlite3` по умолчанию работает в режиме `autocommit`, а модуль Python [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) по умолчанию – нет.10081009Режим `autocommit` означает, что операторы, изменяющие базу данных, вступают в силу немедленно. Оператор `BEGIN` или `SAVEPOINT` отключает режим `autocommit`, а оператор `COMMIT`, `ROLLBACK` или `RELEASE`, завершающий внешнюю транзакцию, снова включает режим `autocommit`.10101011Модуль Python [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) по умолчанию неявно выполняет оператор `BEGIN` перед оператором языка модификации данных (DML) (т.е. `INSERT`/`UPDATE`/`DELETE`/`REPLACE`).10121013Можно управлять тем, какие операторы `BEGIN` [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) выполняет неявно, с помощью параметра *isolation\_level* вызова [`connect()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.connect), или через свойство `isolation_level` соединений. Если не указывать *isolation\_level*, используется простой `BEGIN`, что eквивалентно указанию `DEFERRED`. Другие возможные значения: `IMMEDIATE` и `EXCLUSIVE`.10141015Можно отключить неявное управление транзакциями модуля [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3), установив `isolation_level` в `None`. При этом лежащая в основе библиотека `sqlite3` продолжит работать в режиме `autocommit`. После этого можно полностью управлять состоянием транзакции, явно выполняя операторы `BEGIN`, `ROLLBACK`, `SAVEPOINT` и `RELEASE` в коде.10161017Изменено в версии 3.6: [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) ранее неявно фиксировал открытую транзакцию перед DDL операторами. Теперь это не так.10181019## 12.6.8. Эффективное использование [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3)10201021### 12.6.8.1. Использование сокращённых методов10221023Используя нестандартные методы `execute()`, `executemany()` и `executescript()` объекта [`Connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection), код можно писать более кратко, поскольку не нужно явно создавать (часто излишние) объекты [`Cursor`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor). Вместо этого объекты [`Cursor`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Cursor) создаются неявно, и эти сокращенные методы возвращают объекты курсора. Таким образом, можно выполнить оператор `SELECT` и итерироваться по нему напрямую, используя всего один вызов объекта [`Connection`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection).10241025```python1026import sqlite310271028persons = [1029 ("Hugo", "Boss"),1030 ("Calvin", "Klein")1031 ]10321033con = sqlite3.connect(":memory:")10341035# Создать таблицу1036con.execute("create table person(firstname, lastname)")10371038# Заполнить таблицу1039con.executemany("insert into person(firstname, lastname) values (?, ?)", persons)10401041# Выводит содержимое таблицы.1042for row in con.execute("select firstname, lastname from person"):1043 print(row)10441045print("I just deleted", con.execute("delete from person").rowcount, "rows")1046```10471048### 12.6.8.2. Доступ к столбцам по имени вместо индекса10491050Одна из полезных возможностей модуля [`sqlite3`](https://python-all.ru/3.6/library/sqlite3.html#module-sqlite3) – встроенный класс [`sqlite3.Row`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Row), предназначенный для использования в качестве фабрики строк.10511052Строки, обёрнутые этим классом, можно получать как по индексу (как кортежи), так и по имени без учёта регистра:10531054```python1055import sqlite310561057con = sqlite3.connect(":memory:")1058con.row_factory = sqlite3.Row10591060cur = con.cursor()1061cur.execute("select 'John' as name, 42 as age")1062for row in cur:1063 assert row[0] == row["name"]1064 assert row["name"] == row["nAmE"]1065 assert row[1] == row["age"]1066 assert row[1] == row["AgE"]1067```10681069### 12.6.8.3. Использование соединения в качестве менеджера контекста10701071Объекты соединения можно использовать как менеджеры контекста, которые автоматически фиксируют или откатывают транзакции. В случае исключения транзакция откатывается; в противном случае транзакция фиксируется:10721073```python1074import sqlite310751076con = sqlite3.connect(":memory:")1077con.execute("create table person (id integer primary key, firstname varchar unique)")10781079# При успешном выполнении con.commit() вызывается автоматически.1080with con:1081 con.execute("insert into person(firstname) values (?)", ("Joe",))10821083# con.rollback() вызывается после завершения блока with с исключением,1084# исключение все равно возбуждается, и его необходимо перехватить1085try:1086 with con:1087 con.execute("insert into person(firstname) values (?)", ("Joe",))1088except sqlite3.IntegrityError:1089 print("couldn't add Joe twice")1090```10911092## 12.6.9. Часто встречающиеся проблемы10931094### 12.6.9.1. Многопоточность10951096В старых версиях SQLite были проблемы с совместным использованием соединений между потоками. Именно поэтому модуль Python запрещает совместное использование соединений и курсоров между потоками. Если всё же попытаться это сделать, во время выполнения будет возбуждено исключение.10971098Единственное исключение – вызов метода [`interrupt()`](https://python-all.ru/3.6/library/sqlite3.html#sqlite3.Connection.interrupt), который имеет смысл вызывать только из другого потока.10991100Сноски11011102**1([1](https://python-all.ru/3.6/library/sqlite3.html#id1),[2](https://python-all.ru/3.6/library/sqlite3.html#id2))**11031104Модуль sqlite3 по умолчанию собирается без поддержки загружаемых расширений, поскольку на некоторых платформах (в частности, Mac OS X) библиотеки SQLite скомпилированы без этой возможности. Чтобы получить поддержку загружаемых расширений, необходимо передать параметр –enable-loadable-sqlite-extensions программе configure.1105