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

sqlite3.md

1301 строк · 102.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.10/library/sqlite3.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`sqlite3`](https://python-all.ru/3.10/library/sqlite3.html#module-sqlite3) – интерфейс DB-API 2.0 для баз данных SQLite89**Исходный код:** [Lib/sqlite3/](https://python-all.ru/src/3.10/Lib/sqlite3)1011SQLite – это библиотека на C, которая предоставляет легковесную дисковую базу данных, не требующую отдельного серверного процесса, и позволяет обращаться к базе данных с помощью нестандартного варианта языка SQL. Некоторые приложения могут использовать SQLite для внутреннего хранения данных. Также можно создать прототип приложения на SQLite, а затем перенести код на более крупную базу данных, например PostgreSQL или Oracle.1213Модуль `sqlite3` написан Gerhard Häring. Он предоставляет SQL-интерфейс, совместимый со спецификацией DB-API 2.0, описанной в [**PEP 249**](https://python-all.ru/3.10/library/sqlite3.html), и требует SQLite 3.7.15 или новее.1415Этот документ включает четыре основных раздела:1617- [Руководство](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-tutorial) рассказывает, как использовать модуль `sqlite3`.18- [Справочник](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-reference) описывает классы и функции, которые определяет этот модуль.19- [Практические руководства](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-howtos) подробно описывают выполнение конкретных задач.20- [Пояснение](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-explanation) содержит углубленные сведения об управлении транзакциями.2122> **См. также**23>24> **[https://www.sqlite.org](https://python-all.ru/3.10/library/sqlite3.html)**25>26> Веб-страница SQLite; документация описывает синтаксис и доступные типы данных поддерживаемого диалекта SQL.27>28> **[https://www.w3schools.com/sql/](https://python-all.ru/3.10/library/sqlite3.html)**29>30> Учебные материалы, справочник и примеры для изучения синтаксиса SQL.31>32> **[**PEP 249**](https://python-all.ru/3.10/library/sqlite3.html) – спецификация API баз данных 2.0**33>34> PEP написан Марком-Андре Лембургом.3536## Учебное руководство3738В этом руководстве вы создадите базу данных фильмов Монти Пайтона, используя базовые возможности `sqlite3`. Предполагается базовое понимание концепций баз данных, включая [курсоры](https://python-all.ru/3.10/library/sqlite3.html) и [транзакции](https://python-all.ru/3.10/library/sqlite3.html).3940Сначала нужно создать новую базу данных и открыть соединение с базой данных, чтобы `sqlite3` мог с ней работать. Вызовите [`sqlite3.connect()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.connect), чтобы создать соединение с базой данных `tutorial.db` в текущем рабочем каталоге; если она не существует, она будет неявно создана:4142```python43import sqlite344con = sqlite3.connect("tutorial.db")45```4647Возвращаемый объект [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection) `con` представляет соединение с базой данных на диске.4849Для выполнения SQL-запросов и получения результатов нужно использовать курсор базы данных. Вызовите [`con.cursor()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.cursor), чтобы создать [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor):5051```python52cur = con.cursor()53```5455Теперь, когда у нас есть соединение с базой данных и курсор, можно создать таблицу базы данных `movie` со столбцами для названия, года выпуска и оценки. Для простоты в объявлении таблицы можно использовать только имена столбцов – благодаря функции [гибкой типизации](https://python-all.ru/3.10/library/sqlite3.html) в SQLite указание типов данных необязательно. Выполните оператор `CREATE TABLE`, вызвав [`cur.execute(...)`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute):5657```python58cur.execute("CREATE TABLE movie(title, year, score)")59```6061Можно проверить, что новая таблица создана, запросив встроенную таблицу SQLite `sqlite_master`, в которой теперь должна быть запись для определения таблицы `movie` (подробнее см. [Схема таблицы](https://python-all.ru/3.10/library/sqlite3.html)). Выполните этот запрос, вызвав [`cur.execute(...)`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute), присвойте результат `res` и вызовите [`res.fetchone()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.fetchone) для получения строки результата:6263```pycon64>>> res = cur.execute("SELECT name FROM sqlite_master")65>>> res.fetchone()66('movie',)67```6869Мы видим, что таблица создана, так как запрос возвращает [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple), содержащий имя таблицы. Если запросить `sqlite_master` для несуществующей таблицы `spam`, `res.fetchone()` вернёт `None`:7071```pycon72>>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='spam'")73>>> res.fetchone() is None74True75```7677Теперь добавьте две строки данных, заданные как SQL-литералы, выполнив оператор `INSERT`, снова вызвав [`cur.execute(...)`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute):7879```python80cur.execute("""81    INSERT INTO movie VALUES82        ('Monty Python and the Holy Grail', 1975, 8.2),83        ('And Now for Something Completely Different', 1971, 7.5)84""")85```8687Оператор `INSERT` неявно открывает транзакцию, которую нужно зафиксировать, прежде чем изменения будут сохранены в базе данных (подробнее см. [Управление транзакциями](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-controlling-transactions)). Вызовите [`con.commit()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.commit) у объекта соединения, чтобы зафиксировать транзакцию:8889```python90con.commit()91```9293Можно проверить, что данные вставлены правильно, выполнив запрос `SELECT`. Используйте уже знакомый [`cur.execute(...)`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute), чтобы присвоить результат `res`, и вызовите [`res.fetchall()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.fetchall), чтобы вернуть все строки результата:9495```pycon96>>> res = cur.execute("SELECT score FROM movie")97>>> res.fetchall()98[(8.2,), (7.5,)]99```100101Результат – это [`list`](https://python-all.ru/3.10/library/stdtypes.html#list) из двух `tuple`, по одному на строку, каждый содержит значение `score` этой строки.102103Теперь вставьте ещё три строки, вызвав [`cur.executemany(...)`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executemany):104105```python106data = [107    ("Monty Python Live at the Hollywood Bowl", 1982, 7.9),108    ("Monty Python's The Meaning of Life", 1983, 7.5),109    ("Monty Python's Life of Brian", 1979, 8.0),110]111cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)112con.commit()  # Необходимо зафиксировать транзакцию после выполнения INSERT.113```114115Обратите внимание, что используются местозаполнители `?` для привязки `data` к запросу. Всегда используйте местозаполнители вместо [форматирования строк](https://python-all.ru/3.10/tutorial/inputoutput.html#tut-formatting) для привязки значений Python к SQL-запросам, чтобы избежать [SQL-инъекций](https://python-all.ru/3.10/library/sqlite3.html) (подробнее см. [Как использовать местозаполнители для привязки значений в SQL-запросах](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-placeholders)).116117Можно проверить, что новые строки вставлены, выполнив запрос `SELECT`, на этот раз итерируя по результатам запроса:118119```pycon120>>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):121...     print(row)122(1971, 'And Now for Something Completely Different')123(1975, 'Monty Python and the Holy Grail')124(1979, "Monty Python's Life of Brian")125(1982, 'Monty Python Live at the Hollywood Bowl')126(1983, "Monty Python's The Meaning of Life")127```128129Каждая строка представляет собой [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple) из двух элементов `(year, title)`, соответствующих столбцам, выбранным в запросе.130131Наконец, проверьте, что база данных записана на диск, вызвав [`con.close()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.close), чтобы закрыть существующее соединение, открыть новое, создать новый курсор, а затем выполнить запрос к базе данных:132133```pycon134>>> con.close()135>>> new_con = sqlite3.connect("tutorial.db")136>>> new_cur = new_con.cursor()137>>> res = new_cur.execute("SELECT title, year FROM movie ORDER BY score DESC")138>>> title, year = res.fetchone()139>>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}')140The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975141```142143С помощью модуля `sqlite3` создана база данных SQLite, вставлены данные и извлечены из неё значения несколькими способами.144145> **См. также**146>147> - [Практические руководства](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-howtos) для дальнейшего изучения:148>149>   > - [Как использовать плейсхолдеры для привязки значений в SQL-запросах](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-placeholders)150>   > - [Как адаптировать пользовательские типы Python к значениям SQLite](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-adapters)151>   > - [Как преобразовывать значения SQLite в пользовательские типы Python](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-converters)152>   > - [Как использовать контекстный менеджер соединения](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-connection-context-manager)153>   > - [Как создавать и использовать фабрики строк](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-howto-row-factory)154> - [Объяснение](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-explanation) для углублённого изучения управления транзакциями.155156## Ссылка157158### Функции модуля159160#### `sqlite3.connect(database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=100, uri=False)`161162Открывает соединение с базой данных SQLite.163164**Параметры**165166- **database** ([path-like object](https://python-all.ru/3.10/glossary.html#term-path-like-object)) – путь к файлу базы данных, который требуется открыть. Передайте `":memory:"`, чтобы открыть подключение к базе данных, находящейся в оперативной памяти, а не на диске.167- **timeout** ([*float*](https://python-all.ru/3.10/library/functions.html#float)) – сколько секунд соединение должно ждать перед возбуждением исключения [`OperationalError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.OperationalError), когда таблица заблокирована. Если другое соединение открывает транзакцию для изменения таблицы, эта таблица будет заблокирована до фиксации транзакции. По умолчанию пять секунд.168- **detect\_types** ([*int*](https://python-all.ru/3.10/library/functions.html#int)) – Control whether and how data types not [natively supported by SQLite](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-types) are looked up to be converted to Python types, using the converters registered with [`register_converter()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.register_converter). Set it to any combination (using `|`, bitwise or) of [`PARSE_DECLTYPES`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.PARSE_DECLTYPES) and [`PARSE_COLNAMES`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.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`](https://python-all.ru/3.10/library/stdtypes.html#str) will be returned instead. By default (`0`), type detection is disabled.169- **isolation\_level** (*str | None*) – [`isolation_level`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.isolation_level) подключения, управляющий тем, открываются ли транзакции неявно и каким образом. Может быть `"DEFERRED"` (по умолчанию), `"EXCLUSIVE"` или `"IMMEDIATE"`; либо `None` для отключения неявного открытия транзакций. Подробнее см. [Управление транзакциями](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-controlling-transactions).170- **check\_same\_thread** ([*bool*](https://python-all.ru/3.10/library/functions.html#bool)) – Если `True` (по умолчанию), будет возбуждено [`ProgrammingError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.ProgrammingError), если соединение с базой данных используется потоком, отличным от того, который его создал. Если `False`, к соединению можно обращаться из нескольких потоков; пользователю может потребоваться сериализовать операции записи во избежание повреждения данных. См. [`threadsafety`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.threadsafety) для получения дополнительной информации.171- **factory** ([*Connection*](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection)) – пользовательский подкласс [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection) для создания соединения, если не используется стандартный класс [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection).172- **cached\_statements** ([*int*](https://python-all.ru/3.10/library/functions.html#int)) – количество операторов, которые `sqlite3` должен кешировать внутри себя для этого подключения, чтобы избежать издержек на разбор. По умолчанию – 100 операторов.173- **uri** ([*bool*](https://python-all.ru/3.10/library/functions.html#bool)) – Если установлено в `True`, *database* интерпретируется как URI с путём к файлу и необязательной строкой запроса. Часть схемы *должна* быть `"file:"`, а путь может быть относительным или абсолютным. Строка запроса позволяет передавать параметры SQLite, открывая возможности, описанные в [Работа с URI SQLite](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-uri-tricks).174175**Тип возвращаемого значения**176177[Connection](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection)178179Вызывает [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `sqlite3.connect` с аргументом `database`.180181Вызывает [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `sqlite3.connect/handle` с аргументом `connection_handle`.182183Новое в версии 3.4: Параметр *uri*.184185Изменено в версии 3.7: *database* теперь также может быть [объектом, подобным пути](https://python-all.ru/3.10/glossary.html#term-path-like-object), а не только строкой.186187Новое в версии 3.10: Событие аудита `sqlite3.connect/handle`.188189#### `sqlite3.complete_statement(statement)`190191Возвращает `True`, если строка *statement* содержит один или несколько полных SQL-операторов. Никакая синтаксическая проверка или разбор не выполняются, кроме проверки отсутствия незакрытых строковых литералов и завершения оператора точкой с запятой.192193Например:194195```pycon196>>> sqlite3.complete_statement("SELECT foo FROM bar;")197True198>>> sqlite3.complete_statement("SELECT foo")199False200```201202Эта функция может быть полезна при вводе с командной строки для определения, является ли введённый текст полным SQL-оператором, или требуется дополнительный ввод перед вызовом [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute).203204#### `sqlite3.enable_callback_tracebacks(flag, /)`205206Включить или отключить трассировку стека в колбэках. По умолчанию трассировки стека в пользовательских функциях, агрегатах, конвертерах, колбэках авторизации и т. д. не выводятся. Если требуется их отладка, можно вызвать эту функцию, установив *flag* в `True`. После этого трассировки стека из колбэков будут выводиться через `sys.stderr`. Используйте `False`, чтобы снова отключить эту возможность.207208#### `sqlite3.register_adapter(type, adapter, /)`209210Регистрирует вызываемый объект *adapter* для преобразования типа Python *type* в тип SQLite. Адаптер вызывается с объектом Python типа *type* в качестве единственного аргумента и должен вернуть значение [типа, который SQLite понимает нативно](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-types).211212#### `sqlite3.register_converter(typename, converter, /)`213214Регистрирует вызываемый объект *converter* для преобразования объектов SQLite типа *typename* в объект Python определённого типа. Конвертер вызывается для всех значений SQLite типа *typename*; ему передаётся объект [`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes), и он должен вернуть объект нужного типа Python. Сведения о том, как работает определение типа, см. в описании параметра *detect\_types* функции [`connect()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.connect).215216Примечание: *typename* и имя типа в запросе сравниваются без учёта регистра.217218### Константы модуля219220#### `sqlite3.PARSE_COLNAMES`221222Это значение флага передаётся параметру *detect\_types* функции [`connect()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.connect), чтобы найти функцию-конвертер по имени типа, извлечённому из имени столбца запроса, в качестве ключа словаря конвертеров. Имя типа должно быть заключено в квадратные скобки (`[]`).223224```sql225SELECT p as "p [point]" FROM test;  ! will look up converter "point"226```227228Этот флаг можно комбинировать с [`PARSE_DECLTYPES`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.PARSE_DECLTYPES) с помощью оператора `|` (побитовое ИЛИ).229230#### `sqlite3.PARSE_DECLTYPES`231232Передайте это значение флага параметру *detect\_types* функции [`connect()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.connect) для поиска функции конвертера по объявленным типам каждого столбца. Типы объявляются при создании таблицы базы данных. `sqlite3` будет искать функцию конвертера, используя первое слово объявленного типа в качестве ключа словаря конвертеров. Например:233234```sql235CREATE TABLE test(236   i integer primary key,  ! will look up a converter named "integer"237   p point,                ! will look up a converter named "point"238   n number(10)            ! will look up a converter named "number"239 )240```241242Этот флаг можно комбинировать с [`PARSE_COLNAMES`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.PARSE_COLNAMES) с помощью оператора `|` (побитовое ИЛИ).243244#### `sqlite3.SQLITE_OK`245246#### `sqlite3.SQLITE_DENY`247248#### `sqlite3.SQLITE_IGNORE`249250Флаги, которые должен возвращать вызываемый объект *authorizer\_callback*, передаваемый в [`Connection.set_authorizer()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.set_authorizer), чтобы указать:251252- Доступ разрешён (`SQLITE_OK`),253- Выполнение SQL-оператора должно быть прервано с ошибкой (`SQLITE_DENY`)254- Столбец должен обрабатываться как значение `NULL` (`SQLITE_IGNORE`)255256#### `sqlite3.apilevel`257258Строковая константа, указывающая поддерживаемый уровень DB-API. Требуется спецификацией DB-API. Жёстко закодирована как `"2.0"`.259260#### `sqlite3.paramstyle`261262Строковая константа, указывающая тип форматирования маркеров параметров, ожидаемый модулем `sqlite3`. Требуется спецификацией DB-API. Жёстко закодирована как `"qmark"`.263264> **Примечание**265>266> Также поддерживается стиль параметров DB-API `named`.267268#### `sqlite3.sqlite_version`269270Номер версии библиотеки SQLite во время выполнения в виде [`string`](https://python-all.ru/3.10/library/stdtypes.html#str).271272#### `sqlite3.sqlite_version_info`273274Номер версии библиотеки SQLite времени выполнения как [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple) из [`integers`](https://python-all.ru/3.10/library/functions.html#int).275276#### `sqlite3.threadsafety`277278Целочисленная константа, требуемая DB-API, указывающая уровень потокобезопасности, поддерживаемый модулем `sqlite3`. В настоящее время жёстко задана как `1`, что означает *«Потоки могут совместно использовать модуль, но не подключения».* Однако это не всегда верно. Уровень потокобезопасности, заданный при компиляции библиотеки SQLite, можно проверить следующим запросом:279280```python281import sqlite3282con = sqlite3.connect(":memory:")283con.execute("""284    select * from pragma_compile_options285    where compile_options like 'THREADSAFE=%'286""").fetchall()287```288289Обратите внимание, что [уровни SQLITE\_THREADSAFE](https://python-all.ru/3.10/library/sqlite3.html) не соответствуют уровням DB-API 2.0 `threadsafety`.290291#### `sqlite3.version`292293Номер версии этого модуля в виде [`string`](https://python-all.ru/3.10/library/stdtypes.html#str). Это не версия библиотеки SQLite.294295#### `sqlite3.version_info`296297Номер версии этого модуля в виде [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple) из [`integers`](https://python-all.ru/3.10/library/functions.html#int). Это не версия библиотеки SQLite.298299### Объекты Connection300301#### `class sqlite3.Connection`302303Каждая открытая база данных SQLite представлена объектом `Connection`, который создается с помощью [`sqlite3.connect()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.connect). Их основное назначение – создание объектов [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor) и [управление транзакциями](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-controlling-transactions).304305> **См. также**306>307> - [Как использовать сокращенные методы соединения](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-connection-shortcuts)308> - [Как использовать контекстный менеджер соединения](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-connection-context-manager)309310Соединение с базой данных SQLite имеет следующие атрибуты и методы:311312#### `cursor(factory=Cursor)`313314Создаёт и возвращает объект [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor). Метод cursor принимает один необязательный параметр *factory*. Если он указан, это должен быть вызываемый объект, возвращающий экземпляр [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor) или его подклассов.315316#### `commit()`317318Фиксирует любую ожидающую транзакцию в базе данных. Если нет открытой транзакции, этот метод ничего не делает.319320#### `rollback()`321322Откатывает к началу любой ожидающей транзакции. Если открытая транзакция отсутствует, этот метод ничего не делает.323324#### `close()`325326Закрывает соединение с базой данных. Любая ожидающая транзакция не фиксируется автоматически; перед закрытием необходимо вызвать [`commit()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.commit), чтобы не потерять ожидающие изменения.327328#### `execute(sql, parameters=(), /)`329330Создать новый объект [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor) и вызвать для него [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute) с заданными *sql* и *parameters*. Вернуть новый объект курсора.331332#### `executemany(sql, parameters, /)`333334Создать новый объект [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor) и вызвать для него [`executemany()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executemany) с заданными *sql* и *parameters*. Вернуть новый объект курсора.335336#### `executescript(sql_script, /)`337338Создать новый объект [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor) и вызвать для него [`executescript()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executescript) с заданным *sql\_script*. Вернуть новый объект курсора.339340#### `create_function(name, narg, func, *, deterministic=False)`341342Создать или удалить пользовательскую SQL-функцию.343344**Параметры**345346- **name** ([*str*](https://python-all.ru/3.10/library/stdtypes.html#str)) – Имя SQL-функции.347- **narg** ([*int*](https://python-all.ru/3.10/library/functions.html#int)) – Количество аргументов, которое может принимать SQL-функция. Если `-1`, может принимать любое количество аргументов.348- **func** ([callback](https://python-all.ru/3.10/glossary.html#term-callback) | None) – колбэк, вызываемый при вызове функции SQL. Он должен вернуть [тип, нативно поддерживаемый SQLite](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-types). Установите `None`, чтобы удалить существующую функцию SQL.349- **deterministic** ([*bool*](https://python-all.ru/3.10/library/functions.html#bool)) – Если `True`, созданная SQL-функция помечается как [детерминированная](https://python-all.ru/3.10/library/sqlite3.html), что позволяет SQLite выполнять дополнительные оптимизации.350351**Исключения**352353[**NotSupportedError**](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.NotSupportedError) – Если *deterministic* используется с версиями SQLite ниже 3.8.3.354355Новое в версии 3.8: Параметр *deterministic*.356357Пример:358359```pycon360>>> import hashlib361>>> def md5sum(t):362...     return hashlib.md5(t).hexdigest()363>>> con = sqlite3.connect(":memory:")364>>> con.create_function("md5", 1, md5sum)365>>> for row in con.execute("SELECT md5(?)", (b"foo",)):366...     print(row)367('acbd18db4cc2f85cedef654fccc4a4d8',)368```369370#### `create_aggregate(name, /, n_arg, aggregate_class)`371372Создать или удалить пользовательскую агрегатную SQL-функцию.373374**Параметры**375376- **name** ([*str*](https://python-all.ru/3.10/library/stdtypes.html#str)) – Имя агрегатной SQL-функции.377- **n\_arg** ([*int*](https://python-all.ru/3.10/library/functions.html#int)) – Количество аргументов, которое может принимать агрегатная SQL-функция. Если `-1`, может принимать любое количество аргументов.378- **aggregate\_class** ([class](https://python-all.ru/3.10/glossary.html#term-class) | None) –379380  Класс должен реализовывать следующие методы:381382  - `step()`: Добавить строку в агрегат.383  - `finalize()`: Возвращает окончательный результат агрегата в виде [типа, поддерживаемого SQLite нативно](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-types).384385  Количество аргументов, которое должен принимать метод `step()`, определяется параметром *n\_arg*.386387  Установите `None` для удаления существующей агрегатной SQL-функции.388389Пример:390391```python392class MySum:393    def __init__(self):394        self.count = 0395396    def step(self, value):397        self.count += value398399    def finalize(self):400        return self.count401402con = sqlite3.connect(":memory:")403con.create_aggregate("mysum", 1, MySum)404cur = con.execute("CREATE TABLE test(i)")405cur.execute("INSERT INTO test(i) VALUES(1)")406cur.execute("INSERT INTO test(i) VALUES(2)")407cur.execute("SELECT mysum(i) FROM test")408print(cur.fetchone()[0])409410con.close()411```412413#### `create_collation(name, callable)`414415Создаёт collation с именем *name*, используя функцию сравнения *callable*. *callable* передаётся два аргумента [`string`](https://python-all.ru/3.10/library/stdtypes.html#str), и она должна возвращать [`integer`](https://python-all.ru/3.10/library/functions.html#int):416417- `1`, если первый больше второго418- `-1`, если первый меньше второго419- `0`, если они равны420421Следующий пример демонстрирует collation с обратной сортировкой:422423```python424def collate_reverse(string1, string2):425    if string1 == string2:426        return 0427    elif string1 < string2:428        return 1429    else:430        return -1431432con = sqlite3.connect(":memory:")433con.create_collation("reverse", collate_reverse)434435cur = con.execute("CREATE TABLE test(x)")436cur.executemany("INSERT INTO test(x) VALUES(?)", [("a",), ("b",)])437cur.execute("SELECT x FROM test ORDER BY x COLLATE reverse")438for row in cur:439    print(row)440con.close()441```442443Удаляет функцию collation, устанавливая *callable* в `None`.444445#### `interrupt()`446447Вызовите этот метод из другого потока, чтобы прервать любые запросы, которые могут выполняться на соединении. Прерванные запросы возбудят исключение [`OperationalError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.OperationalError).448449#### `set_authorizer(authorizer_callback)`450451Регистрирует вызываемый объект *authorizer\_callback* для вызова при каждой попытке доступа к столбцу таблицы в базе данных. Колбэк должен возвращать одно из значений [`SQLITE_OK`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.SQLITE_OK), [`SQLITE_DENY`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.SQLITE_DENY) или [`SQLITE_IGNORE`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.SQLITE_IGNORE), чтобы указать, как обрабатывать доступ к столбцу базовой библиотекой SQLite.452453Первый аргумент колбэка указывает, какой тип операции требуется авторизовать. Второй и третий аргументы будут аргументами или `None` в зависимости от первого аргумента. Четвёртый аргумент – имя базы данных («main», «temp» и т.д.), если применимо. Пятый аргумент – имя самого внутреннего триггера или представления, ответственного за попытку доступа, или `None`, если эта попытка доступа происходит непосредственно из входного SQL-кода.454455Обратитесь к документации SQLite за возможными значениями первого аргумента и значением второго и третьего аргументов в зависимости от первого. Все необходимые константы доступны в модуле `sqlite3`.456457#### `set_progress_handler(progress_handler, n)`458459Регистрирует вызываемый объект *progress\_handler* для вызова каждые *n* инструкций виртуальной машины SQLite. Это полезно, если требуется получать вызовы от SQLite во время длительных операций, например для обновления графического интерфейса.460461Чтобы удалить ранее установленный обработчик прогресса, вызовите метод с `None` в качестве *progress\_handler*.462463Возврат ненулевого значения из функции-обработчика завершит выполняющийся запрос и вызовет исключение [`OperationalError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.OperationalError).464465#### `set_trace_callback(trace_callback)`466467Регистрирует вызываемый объект *trace\_callback* для вызова для каждого SQL-запроса, который фактически выполняется внутренним движком SQLite.468469Единственный аргумент, передаваемый колбэку – это выполняемое выражение (в виде [`str`](https://python-all.ru/3.10/library/stdtypes.html#str)). Возвращаемое значение колбэка игнорируется. Обратите внимание, что внутренний движок выполняет не только выражения, переданные методам [`Cursor.execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute). Другие источники включают [управление транзакциями](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-controlling-transactions) модуля `sqlite3` и выполнение триггеров, определённых в текущей базе данных.470471Передача `None` в качестве *trace\_callback* отключает трассировочный колбэк.472473> **Примечание**474>475> Исключения, возникающие в колбэке трассировки, не распространяются. В качестве средства отладки и разработки используйте [`enable_callback_tracebacks()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.enable_callback_tracebacks), чтобы включить печать трассировок для исключений, возникающих в колбэке трассировки.476477Новое в версии 3.3.478479#### `enable_load_extension(enabled, /)`480481Включает загрузку расширений SQLite из разделяемых библиотек, если *enabled* равен `True`; иначе отключает эту возможность. Расширения SQLite могут определять новые функции, агрегаты или целые новые реализации виртуальных таблиц. Известным расширением является расширение полнотекстового поиска, распространяемое вместе с SQLite.482483> **Примечание**484>485> Модуль `sqlite3` по умолчанию собирается без поддержки загружаемых расширений, поскольку на некоторых платформах (в частности, macOS) библиотеки SQLite скомпилированы без этой возможности. Чтобы получить поддержку загружаемых расширений, необходимо передать параметр [`--enable-loadable-sqlite-extensions`](https://python-all.ru/3.10/using/configure.html#cmdoption-enable-loadable-sqlite-extensions) в **configure**.486487Возбуждает [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `sqlite3.enable_load_extension` с аргументами `connection`, `enabled`.488489Новое в версии 3.2.490491Изменено в версии 3.10: Добавлено событие аудита `sqlite3.enable_load_extension`.492493```python494con.enable_load_extension(True)495496# Загрузить расширение полнотекстового поиска.497con.execute("select load_extension('./fts3.so')")498499# в качестве альтернативы можно загрузить расширение с помощью вызова API:500# con.load_extension("./fts3.so")501502# отключить загрузку расширения снова503con.enable_load_extension(False)504505# пример из вики SQLite506con.execute("CREATE VIRTUAL TABLE recipe USING fts3(name, ingredients)")507con.executescript("""508    INSERT INTO recipe (name, ingredients) VALUES('broccoli stew', 'broccoli peppers cheese tomatoes');509    INSERT INTO recipe (name, ingredients) VALUES('pumpkin stew', 'pumpkin onions garlic celery');510    INSERT INTO recipe (name, ingredients) VALUES('broccoli pie', 'broccoli cheese onions flour');511    INSERT INTO recipe (name, ingredients) VALUES('pumpkin pie', 'pumpkin sugar flour butter');512    """)513for row in con.execute("SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'"):514    print(row)515516con.close()517```518519#### `load_extension(path, /)`520521Загружает расширение SQLite из разделяемой библиотеки, расположенной по адресу *path*. Перед вызовом этого метода включите загрузку расширений с помощью [`enable_load_extension()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.enable_load_extension).522523Возбуждает [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `sqlite3.load_extension` с аргументами `connection`, `path`.524525Новое в версии 3.2.526527Изменено в версии 3.10: Добавлено событие аудита `sqlite3.load_extension`.528529#### `iterdump()`530531Возвращает [итератор](https://python-all.ru/3.10/glossary.html#term-iterator) для дампа базы данных в виде SQL-кода. Полезно при сохранении базы данных в памяти для последующего восстановления. Аналог команды `.dump` в оболочке **sqlite3**.532533Пример:534535```python536# Преобразовать файл example.db в дамп SQL dump.sql537con = sqlite3.connect('example.db')538with open('dump.sql', 'w') as f:539    for line in con.iterdump():540        f.write('%s\n' % line)541con.close()542```543544#### `backup(target, *, pages=- 1, progress=None, name='main', sleep=0.250)`545546Создаёт резервную копию базы данных SQLite.547548Работает даже при доступе к базе данных другими клиентами или при одновременной работе через то же подключение.549550**Параметры**551552- **target** ([*Connection*](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection)) – подключение к базе данных, в которое будет сохранена резервная копия.553- **pages** ([*int*](https://python-all.ru/3.10/library/functions.html#int)) – количество страниц, копируемых за один раз. Если значение равно или меньше `0`, вся база данных копируется за один шаг. По умолчанию `-1`.554- **progress** ([колбэк](https://python-all.ru/3.10/glossary.html#term-callback) | None) – Если задан как вызываемый объект, он вызывается с тремя целочисленными аргументами на каждой итерации резервного копирования: *status* последней итерации, *remaining* количество страниц, которые ещё нужно скопировать, и *total* общее количество страниц. По умолчанию `None`.555- **name** ([*str*](https://python-all.ru/3.10/library/stdtypes.html#str)) – имя базы данных для резервного копирования. Это может быть `"main"` (по умолчанию) для основной базы данных, `"temp"` для временной базы данных или имя пользовательской базы данных, добавленной с помощью SQL-выражения `ATTACH DATABASE`.556- **sleep** ([*float*](https://python-all.ru/3.10/library/functions.html#float)) – количество секунд ожидания между последовательными попытками резервного копирования оставшихся страниц.557558Пример 1: копирование существующей базы данных в другую:559560```python561def progress(status, remaining, total):562    print(f'Copied {total-remaining} of {total} pages...')563564src = sqlite3.connect('example.db')565dst = sqlite3.connect('backup.db')566with dst:567    src.backup(dst, pages=1, progress=progress)568dst.close()569src.close()570```571572Пример 2: копирование существующей базы данных во временную копию:573574```python575src = sqlite3.connect('example.db')576dst = sqlite3.connect(':memory:')577src.backup(dst)578```579580Добавлено в версии 3.7.581582#### `in_transaction`583584Этот атрибут, доступный только для чтения, соответствует низкоуровневому [режиму автоматической фиксации SQLite](https://python-all.ru/3.10/library/sqlite3.html).585586`True`, если транзакция активна (есть незафиксированные изменения), `False` в противном случае.587588Новое в версии 3.2.589590#### `isolation_level`591592Этот атрибут управляет [обработкой транзакций](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-controlling-transactions), выполняемой `sqlite3`. Если установлено значение `None`, транзакции никогда не открываются неявно. Если установлено одно из значений `"DEFERRED"`, `"IMMEDIATE"` или `"EXCLUSIVE"`, соответствующих базовому [поведению транзакций SQLite](https://python-all.ru/3.10/library/sqlite3.html), выполняется неявное [управление транзакциями](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-controlling-transactions).593594Если параметр *isolation\_level* в [`connect()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.connect) не переопределяет его, то по умолчанию используется `""`, что является псевдонимом для `"DEFERRED"`.595596#### `row_factory`597598Начальный [`row_factory`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.row_factory) для объектов [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor), созданных из этого соединения. Присвоение этому атрибуту не влияет на `row_factory` существующих курсоров, принадлежащих этому соединению, только новых. По умолчанию установлено `None`, то есть каждая строка возвращается как [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple).599600См. [Как создавать и использовать фабрики строк](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-howto-row-factory) для получения дополнительных сведений.601602#### `text_factory`603604Вызываемый объект, который принимает параметр [`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes) и возвращает его текстовое представление. Вызываемый объект вызывается для значений SQLite с типом данных `TEXT`. По умолчанию этот атрибут установлен в [`str`](https://python-all.ru/3.10/library/stdtypes.html#str). Если требуется возвращать `bytes`, установите *text\_factory* в `bytes`.605606Пример:607608```python609con = sqlite3.connect(":memory:")610cur = con.cursor()611612AUSTRIA = "Österreich"613614# по умолчанию строки возвращаются как str615cur.execute("SELECT ?", (AUSTRIA,))616row = cur.fetchone()617assert row[0] == AUSTRIA618619# но можно заставить sqlite3 всегда возвращать байтовые строки...620con.text_factory = bytes621cur.execute("SELECT ?", (AUSTRIA,))622row = cur.fetchone()623assert type(row[0]) is bytes624# байтовые строки будут в кодировке UTF-8, если только в базу не попал мусор625# база данных...626assert row[0] == AUSTRIA.encode("utf-8")627628# можно также реализовать собственный text_factory...629# здесь реализован такой, который добавляет "foo" ко всем строкам630con.text_factory = lambda x: x.decode("utf-8") + "foo"631cur.execute("SELECT ?", ("bar",))632row = cur.fetchone()633assert row[0] == "barfoo"634635con.close()636```637638#### `total_changes`639640Возвращает общее количество строк базы данных, которые были изменены, вставлены или удалены с момента открытия соединения с базой данных.641642### Объекты курсора643644> Объект `Cursor` представляет собой [курсор базы данных](https://python-all.ru/3.10/library/sqlite3.html), который используется для выполнения SQL-запросов и управления контекстом операции выборки. Курсоры создаются с помощью [`Connection.cursor()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.cursor) или с помощью любого из [сокращённых методов соединения](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-connection-shortcuts).645>646> Объекты курсора являются [итераторами](https://python-all.ru/3.10/glossary.html#term-iterator), то есть если выполнить [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute) запрос `SELECT`, можно просто перебирать курсор для получения результирующих строк:647>648> ```python649> for row in cur.execute("SELECT t FROM data"):650>     print(row)651> ```652653#### `class sqlite3.Cursor`654655Экземпляр [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor) имеет следующие атрибуты и методы.656657#### `execute(sql, parameters=(), /)`658659Выполняет один SQL-запрос, с возможностью привязки значений Python с помощью [placeholders](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-placeholders).660661**Параметры**662663- **sql** ([*str*](https://python-all.ru/3.10/library/stdtypes.html#str)) – Один SQL-запрос.664- **parameters** ([`dict`](https://python-all.ru/3.10/library/stdtypes.html#dict) | [sequence](https://python-all.ru/3.10/glossary.html#term-sequence)) – Значения Python для привязки к плейсхолдерам в *sql*. `dict`, если используются именованные плейсхолдеры. последовательность, если используются безымянные плейсхолдеры. См. [Как использовать плейсхолдеры для привязки значений в SQL-запросах](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-placeholders).665666**Возбуждает**667668[**Warning**](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Warning) – Если *sql* содержит более одного SQL-запроса.669670Если [`isolation_level`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.isolation_level) не равен `None`, *sql* является `INSERT`, `UPDATE`, `DELETE` или `REPLACE` инструкцией, и нет открытой транзакции, перед выполнением *sql* неявно открывается транзакция.671672Используйте [`executescript()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executescript) для выполнения нескольких SQL-запросов.673674#### `executemany(sql, parameters, /)`675676Для каждого элемента в *parameters* повторно выполняет [параметризованный](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-placeholders) SQL-запрос *sql*.677678Использует ту же неявную обработку транзакций, что и [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute).679680**Параметры**681682- **sql** ([*str*](https://python-all.ru/3.10/library/stdtypes.html#str)) – Один SQL-запрос DML.683- **parameters** ([iterable](https://python-all.ru/3.10/glossary.html#term-iterable)) – итерируемый объект с параметрами для привязки к плейсхолдерам в *sql*. См. [Как использовать плейсхолдеры для привязки значений в SQL-запросах](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-placeholders).684685**Возбуждает**686687- [**ProgrammingError**](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.ProgrammingError) – Если *sql* не является запросом DML.688- [**Warning**](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Warning) – Если *sql* содержит более одного SQL-запроса.689690Пример:691692```python693rows = [694    ("row1",),695    ("row2",),696]697# cur – объект sqlite3.Cursor698cur.executemany("INSERT INTO data VALUES(?)", rows)699```700701#### `executescript(sql_script, /)`702703Выполняет SQL-инструкции из *sql\_script*. Если есть ожидающая транзакция, сначала неявно выполняется `COMMIT`. Никакого другого неявного управления транзакциями не производится; все управление транзакциями должно быть добавлено в *sql\_script*.704705*sql\_script* должен быть [`string`](https://python-all.ru/3.10/library/stdtypes.html#str).706707Пример:708709```python710# cur – объект sqlite3.Cursor711cur.executescript("""712    BEGIN;713    CREATE TABLE person(firstname, lastname, age);714    CREATE TABLE book(title, author, published);715    CREATE TABLE publisher(name, address);716    COMMIT;717""")718```719720#### `fetchone()`721722Если [`row_factory`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.row_factory) равен `None`, возвращает следующую строку результирующего набора как [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple). Иначе передаёт её фабрике строк и возвращает результат. Возвращает `None`, если данные закончились.723724#### `fetchmany(size=cursor.arraysize)`725726Возвращает следующий набор строк результата запроса как [`list`](https://python-all.ru/3.10/library/stdtypes.html#list). Возвращает пустой список, если строк больше нет.727728Количество строк, извлекаемых за один вызов, задаётся параметром *size*. Если *size* не указан, количество извлекаемых строк определяется [`arraysize`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.arraysize). Если доступно меньше строк, чем *size*, возвращается столько строк, сколько есть.729730Обратите внимание, что параметр *size* связан с производительностью. Для оптимальной производительности обычно лучше использовать атрибут arraysize. Если используется параметр *size*, рекомендуется сохранять одно и то же значение от одного вызова [`fetchmany()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.fetchmany) к следующему.731732#### `fetchall()`733734Возвращает все (оставшиеся) строки результата запроса как [`list`](https://python-all.ru/3.10/library/stdtypes.html#list). Возвращает пустой список, если строк нет. Обратите внимание, что атрибут [`arraysize`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.arraysize) может влиять на производительность этой операции.735736#### `close()`737738Закрывает курсор сейчас (а не при вызове `__del__`).739740Курсор станет непригодным к использованию; будет выброшено исключение [`ProgrammingError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.ProgrammingError) при любой попытке выполнить операцию с курсором.741742#### `setinputsizes(sizes, /)`743744Требуется DB-API. Ничего не делает в `sqlite3`.745746#### `setoutputsize(size, column=None, /)`747748Требуется DB-API. Ничего не делает в `sqlite3`.749750#### `arraysize`751752Атрибут чтения/записи, управляющий количеством строк, возвращаемых [`fetchmany()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.fetchmany). Значение по умолчанию – 1, то есть при каждом вызове будет извлечена одна строка.753754#### `connection`755756Атрибут только для чтения, предоставляющий соединение с базой данных SQLite [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection), принадлежащее курсору. Объект [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor), созданный вызовом [`con.cursor()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.cursor), будет иметь атрибут [`connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.connection), который ссылается на *con*:757758```pycon759>>> con = sqlite3.connect(":memory:")760>>> cur = con.cursor()761>>> cur.connection == con762True763```764765#### `description`766767Атрибут только для чтения, предоставляющий имена столбцов последнего запроса. Для сохранения совместимости с Python DB API он возвращает кортеж из 7 элементов для каждого столбца, где последние шесть элементов каждого кортежа равны `None`.768769Он также устанавливается для операторов `SELECT`, не имеющих подходящих строк.770771#### `lastrowid`772773Атрибут только для чтения, предоставляющий идентификатор строки последней вставленной строки. Он обновляется только после успешного выполнения операторов `INSERT` или `REPLACE` с использованием метода [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute). Для других операторов, после [`executemany()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executemany) или [`executescript()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executescript), или если вставка не удалась, значение `lastrowid` остаётся без изменений. Начальное значение `lastrowid` равно `None`.774775> **Примечание**776>777> Вставки в таблицы `WITHOUT ROWID` не записываются.778779Изменено в версии 3.6: Добавлена поддержка оператора `REPLACE`.780781#### `rowcount`782783Атрибут только для чтения, который предоставляет количество изменённых строк для запросов `INSERT`, `UPDATE`, `DELETE` и `REPLACE`; равен `-1` для других запросов, включая запросы CTE. Обновляется только методами [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute) и [`executemany()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executemany).784785#### `row_factory`786787Управляет представлением строки, извлечённой из этого `Cursor`. Если `None`, строка представляется как [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple). Может быть установлен во встроенный [`sqlite3.Row`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Row); или в [вызываемый объект](https://python-all.ru/3.10/glossary.html#term-callable), который принимает два аргумента: объект [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor) и `tuple` значений строки, и возвращает пользовательский объект, представляющий строку SQLite.788789По умолчанию равно тому, на что был установлен [`Connection.row_factory`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.row_factory) при создании `Cursor`. Присваивание этому атрибуту не влияет на [`Connection.row_factory`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.row_factory) родительского соединения.790791См. [Как создавать и использовать фабрики строк](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-howto-row-factory) для получения дополнительных сведений.792793### Объекты Row794795#### `class sqlite3.Row`796797Экземпляр `Row` служит высокооптимизированным [`row_factory`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.row_factory) для объектов [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection). Он поддерживает итерацию, проверку равенства, [`len()`](https://python-all.ru/3.10/library/functions.html#len) и доступ через [отображение](https://python-all.ru/3.10/glossary.html#term-mapping) по имени столбца и индексу.798799Два объекта `Row` считаются равными, если они имеют одинаковые имена столбцов и значения.800801См. [Как создавать и использовать фабрики строк](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-howto-row-factory) для получения дополнительных сведений.802803#### `keys()`804805Возвращает [`list`](https://python-all.ru/3.10/library/stdtypes.html#list) имен столбцов в виде [`strings`](https://python-all.ru/3.10/library/stdtypes.html#str). Сразу после запроса это первый элемент каждого кортежа в [`Cursor.description`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.description).806807Изменено в версии 3.5: Добавлена поддержка срезов.808809### Объекты PrepareProtocol810811#### `class sqlite3.PrepareProtocol`812813Единственное назначение типа PrepareProtocol – служить протоколом адаптации в стиле [**PEP 246**](https://python-all.ru/3.10/library/sqlite3.html) для объектов, которые могут [адаптироваться](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-conform) к [встроенным типам SQLite](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-types).814815### Исключения816817Иерархия исключений определена в DB-API 2.0 ([**PEP 249**](https://python-all.ru/3.10/library/sqlite3.html)).818819#### `exception sqlite3.Warning`820821Это исключение возбуждается `sqlite3`, если SQL-запрос не является [`string`](https://python-all.ru/3.10/library/stdtypes.html#str), или если несколько запросов переданы в [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute) или [`executemany()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executemany). `Warning` является подклассом [`Exception`](https://python-all.ru/3.10/library/exceptions.html#Exception).822823#### `exception sqlite3.Error`824825Базовый класс для остальных исключений этого модуля. Используйте его, чтобы перехватывать все ошибки одним оператором [`except`](https://python-all.ru/3.10/reference/compound_stmts.html#except). `Error` является подклассом [`Exception`](https://python-all.ru/3.10/library/exceptions.html#Exception).826827#### `exception sqlite3.InterfaceError`828829Это исключение возбуждается `sqlite3` при выборке через откат, или если `sqlite3` не может привязать параметры. `InterfaceError` является подклассом [`Error`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Error).830831#### `exception sqlite3.DatabaseError`832833Исключение возбуждается для ошибок, связанных с базой данных. Оно служит базовым исключением для нескольких типов ошибок базы данных. Возбуждается только неявно через специализированные подклассы. `DatabaseError` является подклассом [`Error`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Error).834835#### `exception sqlite3.DataError`836837Исключение возбуждается для ошибок, вызванных проблемами с обрабатываемыми данными, например, числовые значения вне допустимого диапазона или слишком длинные строки. `DataError` является подклассом [`DatabaseError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.DatabaseError).838839#### `exception sqlite3.OperationalError`840841Исключение возникает при ошибках, связанных с работой базы данных, и не обязательно подконтрольных программисту. Например, не найден путь к базе данных или не удалось выполнить транзакцию. `OperationalError` является подклассом [`DatabaseError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.DatabaseError).842843#### `exception sqlite3.IntegrityError`844845Исключение возникает при нарушении реляционной целостности базы данных, например, при неудачной проверке внешнего ключа. Оно является подклассом [`DatabaseError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.DatabaseError).846847#### `exception sqlite3.InternalError`848849Исключение возникает, когда SQLite сталкивается с внутренней ошибкой. Если оно возникло, это может указывать на проблему с используемой библиотекой SQLite. `InternalError` является подклассом [`DatabaseError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.DatabaseError).850851#### `exception sqlite3.ProgrammingError`852853Исключение, возбуждаемое при ошибках программирования `sqlite3` API, например при попытке оперировать закрытым [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection) или при попытке выполнить запросы, не являющиеся DML, с помощью [`executemany()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executemany). `ProgrammingError` является подклассом [`DatabaseError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.DatabaseError).854855#### `exception sqlite3.NotSupportedError`856857Исключение возникает, если метод или API базы данных не поддерживается используемой библиотекой SQLite. Например, установка *deterministic* в `True` в [`create_function()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.create_function), если базовая библиотека SQLite не поддерживает детерминированные функции. `NotSupportedError` является подклассом [`DatabaseError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.DatabaseError).858859### Типы SQLite и Python860861SQLite изначально поддерживает следующие типы: `NULL`, `INTEGER`, `REAL`, `TEXT`, `BLOB`.862863Следующие типы Python можно передавать в SQLite без каких-либо проблем:864865| Тип Python | Тип SQLite |866| --- | --- |867| `None` | `NULL` |868| [`int`](https://python-all.ru/3.10/library/functions.html#int) | `INTEGER` |869| [`float`](https://python-all.ru/3.10/library/functions.html#float) | `REAL` |870| [`str`](https://python-all.ru/3.10/library/stdtypes.html#str) | `TEXT` |871| [`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes) | `BLOB` |872873Так по умолчанию типы SQLite преобразуются в типы Python:874875| Тип SQLite | Тип Python |876| --- | --- |877| `NULL` | `None` |878| `INTEGER` | [`int`](https://python-all.ru/3.10/library/functions.html#int) |879| `REAL` | [`float`](https://python-all.ru/3.10/library/functions.html#float) |880| `TEXT` | зависит от [`text_factory`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.text_factory), по умолчанию [`str`](https://python-all.ru/3.10/library/stdtypes.html#str) |881| `BLOB` | [`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes) |882883Система типов модуля `sqlite3` расширяема двумя способами: можно сохранять дополнительные типы Python в базе данных SQLite через [адаптеры объектов](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-adapters) и можно позволить модулю `sqlite3` преобразовывать типы SQLite в типы Python через [конвертеры](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-converters).884885### Адаптеры и преобразователи по умолчанию886887В модуле datetime есть адаптеры по умолчанию для типов date и datetime. Они отправляются в SQLite как даты/временные метки в формате ISO.888889Преобразователи по умолчанию зарегистрированы под именем «date» для [`datetime.date`](https://python-all.ru/3.10/library/datetime.html#datetime.date) и под именем «timestamp» для [`datetime.datetime`](https://python-all.ru/3.10/library/datetime.html#datetime.datetime).890891Таким образом, в большинстве случаев можно использовать даты и временные метки из Python без лишних усилий. Формат адаптеров также совместим с экспериментальными функциями даты/времени SQLite.892893Следующий пример демонстрирует это.894895```python896import sqlite3897import datetime898899con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)900cur = con.cursor()901cur.execute("create table test(d date, ts timestamp)")902903today = datetime.date.today()904now = datetime.datetime.now()905906cur.execute("insert into test(d, ts) values (?, ?)", (today, now))907cur.execute("select d, ts from test")908row = cur.fetchone()909print(today, "=>", row[0], type(row[0]))910print(now, "=>", row[1], type(row[1]))911912cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"')913row = cur.fetchone()914print("current_date", row[0], type(row[0]))915print("current_timestamp", row[1], type(row[1]))916917con.close()918```919920Если временная метка, хранящаяся в SQLite, имеет дробную часть длиннее 6 знаков, её значение будет усечено до микросекундной точности преобразователем временных меток.921922> **Примечание**923>924> Конвертер "timestamp" по умолчанию игнорирует смещения UTC в базе данных и всегда возвращает наивный объект [`datetime.datetime`](https://python-all.ru/3.10/library/datetime.html#datetime.datetime). Чтобы сохранить смещения UTC в метках времени, либо оставьте конвертеры отключёнными, либо зарегистрируйте конвертер с учётом смещения через [`register_converter()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.register_converter).925926## Практические руководства927928### Как использовать плейсхолдеры для подстановки значений в SQL-запросы929930Обычно в SQL-операциях нужно использовать значения из переменных Python. Однако следует остерегаться использования строковых операций Python для сборки запросов, так как они уязвимы для [атак с помощью SQL-инъекций](https://python-all.ru/3.10/library/sqlite3.html). Например, злоумышленник может просто закрыть одинарную кавычку и добавить `OR TRUE` для выборки всех строк:931932```python933>>> # Никогда не делайте этого – это небезопасно!934>>> symbol = input()935' OR TRUE; --936>>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol937>>> print(sql)938SELECT * FROM stocks WHERE symbol = '' OR TRUE; --'939>>> cur.execute(sql)940```941942Вместо этого используйте подстановку параметров DB-API. Чтобы вставить переменную в строку запроса, используйте плейсхолдер в строке и подставьте фактические значения в запрос, передав их в виде [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple) значений вторым аргументом метода [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute) курсора.943944SQL-выражение может использовать один из двух видов заполнителей: вопросительные знаки (стиль qmark) или именованные заполнители (стиль named). Для стиля qmark *параметры* должны быть [последовательностью](https://python-all.ru/3.10/glossary.html#term-sequence), длина которой должна совпадать с числом заполнителей, иначе возбуждается [`ProgrammingError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.ProgrammingError). Для именованного стиля *параметры* должны быть экземпляром [`dict`](https://python-all.ru/3.10/library/stdtypes.html#dict) (или подкласса), который должен содержать ключи для всех именованных параметров; любые лишние элементы игнорируются. Вот пример обоих стилей:945946```python947con = sqlite3.connect(":memory:")948cur = con.execute("CREATE TABLE lang(name, first_appeared)")949950# Это стиль с именованными параметрами, используемый с executemany():951data = (952    {"name": "C", "year": 1972},953    {"name": "Fortran", "year": 1957},954    {"name": "Python", "year": 1991},955    {"name": "Go", "year": 2009},956)957cur.executemany("INSERT INTO lang VALUES(:name, :year)", data)958959# Это стиль с вопросительными знаками, используемый в запросе SELECT:960params = (1972,)961cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)962print(cur.fetchall())963```964965> **Примечание**966>967> Числовые плейсхолдеры [**PEP 249**](https://python-all.ru/3.10/library/sqlite3.html) *не* поддерживаются. Если их использовать, они будут интерпретироваться как именованные.968969### Как адаптировать пользовательские типы Python к значениям SQLite970971SQLite изначально поддерживает только ограниченный набор типов данных. Чтобы хранить пользовательские типы Python в базах данных SQLite, *адаптируйте* их к одному из [типов Python, которые SQLite понимает изначально](https://python-all.ru/3.10/library/sqlite3.html#sqlite3-types).972973Существует два способа адаптации объектов Python к типам SQLite: разрешить объекту адаптироваться самостоятельно или использовать *вызываемый адаптер*. Последний имеет приоритет над первым. Для библиотеки, которая предоставляет пользовательский тип, может иметь смысл разрешить этому типу адаптироваться самостоятельно. Для разработчика приложений может быть более разумным взять прямой контроль, зарегистрировав собственные функции-адаптеры.974975#### Как создавать адаптируемые объекты976977Предположим, у нас есть класс `Point`, представляющий пару координат `x` и `y` в декартовой системе координат. Пара координат будет храниться в базе данных в виде текстовой строки с точкой с запятой в качестве разделителя. Это можно реализовать, добавив метод `__conform__(self, protocol)`, который возвращает адаптированное значение. Объект, передаваемый в *протокол*, будет иметь тип [`PrepareProtocol`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.PrepareProtocol).978979```python980class Point:981    def __init__(self, x, y):982        self.x, self.y = x, y983984    def __conform__(self, protocol):985        if protocol is sqlite3.PrepareProtocol:986            return f"{self.x};{self.y}"987988con = sqlite3.connect(":memory:")989cur = con.cursor()990991cur.execute("SELECT ?", (Point(4.0, -3.2),))992print(cur.fetchone()[0])993```994995#### Как регистрировать вызываемые адаптеры996997Другая возможность – создать функцию, которая преобразует объект Python в тип, совместимый с SQLite. Затем эту функцию можно зарегистрировать с помощью [`register_adapter()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.register_adapter).998999```python1000class Point:1001    def __init__(self, x, y):1002        self.x, self.y = x, y10031004def adapt_point(point):1005    return f"{point.x};{point.y}"10061007sqlite3.register_adapter(Point, adapt_point)10081009con = sqlite3.connect(":memory:")1010cur = con.cursor()10111012cur.execute("SELECT ?", (Point(1.0, 2.5),))1013print(cur.fetchone()[0])1014```10151016### Как преобразовывать значения SQLite в пользовательские типы Python10171018Написание адаптера позволяет преобразовывать *из* пользовательских типов Python *в* значения SQLite. Чтобы иметь возможность преобразовывать *из* значений SQLite *в* пользовательские типы Python, мы используем *конвертеры*.10191020Вернемся к классу `Point`. Мы сохраняли координаты x и y, разделенные точкой с запятой, в виде строк в SQLite.10211022Сначала определим функцию-конвертер, которая принимает строку в качестве параметра и создает из нее объект `Point`.10231024> **Примечание**1025>1026> Функции-конвертеры **всегда** получают объект [`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes), независимо от нижележащего типа данных SQLite.10271028```python1029def convert_point(s):1030    x, y = map(float, s.split(b";"))1031    return Point(x, y)1032```10331034Теперь нужно указать `sqlite3`, когда следует преобразовывать данное значение SQLite. Это делается при подключении к базе данных с помощью параметра *detect\_types* функции [`connect()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.connect). Есть три варианта:10351036- Неявный: установите *detect\_types* в [`PARSE_DECLTYPES`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.PARSE_DECLTYPES)1037- Явный: установите *detect\_types* в [`PARSE_COLNAMES`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.PARSE_COLNAMES)1038- Оба: установите *detect\_types* в `sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES`. Имена столбцов имеют приоритет над объявленными типами.10391040Следующий пример иллюстрирует неявный и явный подходы:10411042```python1043class Point:1044    def __init__(self, x, y):1045        self.x, self.y = x, y10461047    def __repr__(self):1048        return f"Point({self.x}, {self.y})"10491050def adapt_point(point):1051    return f"{point.x};{point.y}"10521053def convert_point(s):1054    x, y = list(map(float, s.split(b";")))1055    return Point(x, y)10561057# Зарегистрировать адаптер и конвертер1058sqlite3.register_adapter(Point, adapt_point)1059sqlite3.register_converter("point", convert_point)10601061# 1) Разбор с использованием объявленных типов1062p = Point(4.0, -3.2)1063con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)1064cur = con.execute("CREATE TABLE test(p point)")10651066cur.execute("INSERT INTO test(p) VALUES(?)", (p,))1067cur.execute("SELECT p FROM test")1068print("with declared types:", cur.fetchone()[0])1069cur.close()1070con.close()10711072# 2) Разбор с использованием имён столбцов1073con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)1074cur = con.execute("CREATE TABLE test(p)")10751076cur.execute("INSERT INTO test(p) VALUES(?)", (p,))1077cur.execute('SELECT p AS "p [point]" FROM test')1078print("with column names:", cur.fetchone()[0])1079```10801081### Рецепты адаптеров и конвертеров10821083В этом разделе приведены рецепты для распространенных адаптеров и конвертеров.10841085```python1086import datetime1087import sqlite310881089def adapt_date_iso(val):1090    """Адаптировать datetime.date к дате в формате ISO 8601."""1091    return val.isoformat()10921093def adapt_datetime_iso(val):1094    """Преобразует datetime.datetime в дату ISO 8601 без часового пояса."""1095    return val.isoformat()10961097def adapt_datetime_epoch(val):1098    """Преобразует datetime.datetime в метку времени Unix."""1099    return int(val.timestamp())11001101sqlite3.register_adapter(datetime.date, adapt_date_iso)1102sqlite3.register_adapter(datetime.datetime, adapt_datetime_iso)1103sqlite3.register_adapter(datetime.datetime, adapt_datetime_epoch)11041105def convert_date(val):1106    """Преобразует дату ISO 8601 в объект datetime.date."""1107    return datetime.date.fromisoformat(val.decode())11081109def convert_datetime(val):1110    """Преобразует дату и время ISO 8601 в объект datetime.datetime."""1111    return datetime.datetime.fromisoformat(val.decode())11121113def convert_timestamp(val):1114    """Преобразует метку времени Unix (эпоха) в объект datetime.datetime."""1115    return datetime.datetime.fromtimestamp(int(val))11161117sqlite3.register_converter("date", convert_date)1118sqlite3.register_converter("datetime", convert_datetime)1119sqlite3.register_converter("timestamp", convert_timestamp)1120```11211122### Как использовать сокращенные методы соединения11231124Используя методы [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.execute), [`executemany()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.executemany) и [`executescript()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.executescript) класса [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection), можно писать код более кратко, поскольку не нужно явно создавать (часто излишние) объекты [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor). Вместо этого объекты [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor) создаются неявно, и эти сокращенные методы возвращают объекты курсора. Таким образом, можно выполнить оператор `SELECT` и сразу перебирать его результаты, используя всего один вызов на объекте [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection).11251126```python1127# Создаёт и заполняет таблицу.1128con = sqlite3.connect(":memory:")1129con.execute("CREATE TABLE lang(name, first_appeared)")1130data = [1131    ("C++", 1985),1132    ("Objective-C", 1984),1133]1134con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data)11351136# Выводит содержимое таблицы.1137for row in con.execute("SELECT name, first_appeared FROM lang"):1138    print(row)11391140print("I just deleted", con.execute("DELETE FROM lang").rowcount, "rows")11411142# close() не является сокращённым методом и не вызывается автоматически.1143# Объект соединения следует закрывать вручную.1144con.close()1145```11461147### Как использовать менеджер контекста соединения11481149Объект [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection) можно использовать как контекстный менеджер, который автоматически фиксирует или откатывает открытые транзакции при выходе из тела контекстного менеджера. Если тело оператора [`with`](https://python-all.ru/3.10/reference/compound_stmts.html#with) завершается без исключений, транзакция фиксируется. Если эта фиксация не удалась или тело оператора `with` возбуждает необработанное исключение, транзакция откатывается.11501151Если при выходе из тела оператора `with` нет открытой транзакции, контекстный менеджер ничего не делает.11521153> **Примечание**1154>1155> Менеджер контекста не открывает неявно новую транзакцию и не закрывает соединение.11561157```python1158con = sqlite3.connect(":memory:")1159con.execute("CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)")11601161# При успешном выполнении con.commit() вызывается автоматически.1162with con:1163    con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))11641165# con.rollback() вызывается после завершения блока with с исключением,1166# исключение по-прежнему возбуждается и должно быть перехвачено.1167try:1168    with con:1169        con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))1170except sqlite3.IntegrityError:1171    print("couldn't add Python twice")11721173# Объект Connection, используемый как контекстный менеджер, только фиксирует или откатывает транзакции,1174# поэтому объект соединения следует закрывать вручную.1175con.close()1176```11771178### Как работать с SQLite URI11791180Некоторые полезные приёмы работы с URI:11811182- Открыть базу данных в режиме только для чтения:11831184```pycon1185>>> con = sqlite3.connect("file:tutorial.db?mode=ro", uri=True)1186>>> con.execute("CREATE TABLE readonly(data)")1187Traceback (most recent call last):1188OperationalError: attempt to write a readonly database1189```11901191- Не создавать неявно новый файл базы данных, если он ещё не существует; будет вызвано исключение [`OperationalError`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.OperationalError), если не удаётся создать новый файл:11921193```pycon1194>>> con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True)1195Traceback (most recent call last):1196OperationalError: unable to open database file1197```11981199- Создать общую именованную базу данных в памяти:12001201```python1202db = "file:mem1?mode=memory&cache=shared"1203con1 = sqlite3.connect(db, uri=True)1204con2 = sqlite3.connect(db, uri=True)1205with con1:1206    con1.execute("CREATE TABLE shared(data)")1207    con1.execute("INSERT INTO shared VALUES(28)")1208res = con2.execute("SELECT data FROM shared")1209assert res.fetchone() == (28,)1210```12111212Дополнительную информацию об этой возможности, включая список параметров, можно найти в [документации SQLite по URI](https://python-all.ru/3.10/library/sqlite3.html).12131214### Как создавать и использовать фабрики строк12151216По умолчанию `sqlite3` представляет каждую строку как [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple). Если `tuple` не подходит, можно использовать класс [`sqlite3.Row`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Row) или собственную [`row_factory`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.row_factory).12171218Хотя `row_factory` существует как атрибут как у [`Cursor`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor), так и у [`Connection`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection), рекомендуется устанавливать [`Connection.row_factory`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.row_factory), чтобы все курсоры, созданные из соединения, использовали одну и ту же фабрику строк.12191220`Row` обеспечивает индексированный и регистронезависимый доступ к столбцам по имени с минимальным потреблением памяти и влиянием на производительность по сравнению с `tuple`. Чтобы использовать `Row` в качестве фабрики строк, присвойте его атрибуту `row_factory`:12211222```pycon1223>>> con = sqlite3.connect(":memory:")1224>>> con.row_factory = sqlite3.Row1225```12261227Теперь запросы возвращают объекты `Row`:12281229```pycon1230>>> res = con.execute("SELECT 'Earth' AS name, 6378 AS radius")1231>>> row = res.fetchone()1232>>> row.keys()1233['name', 'radius']1234>>> row[0]         # Доступ по индексу.1235'Earth'1236>>> row["name"]    # Доступ по имени.1237'Earth'1238>>> row["RADIUS"]  # Имена столбцов нечувствительны к регистру.123963781240```12411242Можно создать собственную [`row_factory`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.row_factory), которая возвращает каждую строку как [`dict`](https://python-all.ru/3.10/library/stdtypes.html#dict), с сопоставлением имён столбцов со значениями:12431244```python1245def dict_factory(cursor, row):1246    fields = [column[0] for column in cursor.description]1247    return {key: value for key, value in zip(fields, row)}1248```12491250При её использовании запросы теперь возвращают `dict` вместо `tuple`:12511252```pycon1253>>> con = sqlite3.connect(":memory:")1254>>> con.row_factory = dict_factory1255>>> for row in con.execute("SELECT 1 AS a, 2 AS b"):1256...     print(row)1257{'a': 1, 'b': 2}1258```12591260Следующая фабрика строк возвращает [именованный кортеж](https://python-all.ru/3.10/glossary.html#term-named-tuple):12611262```python1263from collections import namedtuple12641265def namedtuple_factory(cursor, row):1266    fields = [column[0] for column in cursor.description]1267    cls = namedtuple("Row", fields)1268    return cls._make(row)1269```12701271`namedtuple_factory()` можно использовать следующим образом:12721273```pycon1274>>> con = sqlite3.connect(":memory:")1275>>> con.row_factory = namedtuple_factory1276>>> cur = con.execute("SELECT 1 AS a, 2 AS b")1277>>> row = cur.fetchone()1278>>> row1279Row(a=1, b=2)1280>>> row[0]  # Индексный доступ.128111282>>> row.b   # Доступ через атрибут.128321284```12851286С некоторыми изменениями приведённый рецепт можно адаптировать для использования [`dataclass`](https://python-all.ru/3.10/library/dataclasses.html#dataclasses.dataclass) или любого другого пользовательского класса вместо [`namedtuple`](https://python-all.ru/3.10/library/collections.html#collections.namedtuple).12871288## Пояснение12891290### Управление транзакциями12911292Модуль `sqlite3` не придерживается обработки транзакций, рекомендуемой [**PEP 249**](https://python-all.ru/3.10/library/sqlite3.html).12931294Если атрибут соединения [`isolation_level`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.isolation_level) не равен `None`, новые транзакции неявно открываются перед тем, как [`execute()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.execute) и [`executemany()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executemany) выполняют `INSERT`, `UPDATE`, `DELETE` или `REPLACE` операторы; для других операторов неявная обработка транзакций не выполняется. Используйте методы [`commit()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.commit) и [`rollback()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.rollback) для фиксации и отката ожидающих транзакций соответственно. Можно выбрать базовое [поведение транзакций SQLite](https://python-all.ru/3.10/library/sqlite3.html) – то есть, будут ли и какого типа `BEGIN` операторы `sqlite3` выполняет неявно – через атрибут [`isolation_level`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.isolation_level).12951296Если [`isolation_level`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.isolation_level) установлен в `None`, транзакции вообще не открываются неявно. Это оставляет базовую библиотеку SQLite в [режиме автокоммита](https://python-all.ru/3.10/library/sqlite3.html), но также позволяет пользователю выполнять собственную обработку транзакций с помощью явных SQL-операторов. Режим автокоммита базовой библиотеки SQLite можно запросить с помощью атрибута [`in_transaction`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.in_transaction).12971298Метод [`executescript()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Cursor.executescript) неявно фиксирует любую ожидающую транзакцию перед выполнением данного SQL-скрипта, независимо от значения [`isolation_level`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.isolation_level).12991300Изменено в версии 3.6: `sqlite3` ранее неявно фиксировал открытую транзакцию перед DDL операторами. Теперь это не так.1301