sqlite3.md
1> **Источник:** https://python-all.ru/2.7/library/sqlite3.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 11.13. [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) – интерфейс DB-API 2.0 для баз данных SQLite89Новое в версии 2.5.1011SQLite – это библиотека на C, которая предоставляет легковесную дисковую базу данных, не требующую отдельного серверного процесса, и позволяет обращаться к базе данных с помощью нестандартного варианта языка SQL. Некоторые приложения могут использовать SQLite для внутреннего хранения данных. Также можно создать прототип приложения на SQLite, а затем перенести код на более крупную базу данных, например PostgreSQL или Oracle.1213Модуль sqlite3 написан Герхардом Харингом. Он предоставляет SQL-интерфейс, соответствующий спецификации DB-API 2.0, описанной в [**PEP 249**](https://python-all.ru/2.7/library/sqlite3.html).1415Чтобы использовать модуль, сначала необходимо создать объект [`Connection`](https://python-all.ru/2.7/library/multiprocessing.html#Connection), который представляет базу данных. Здесь данные будут храниться в файле `example.db`:1617```python18import sqlite319conn = sqlite3.connect('example.db')20```2122Также можно указать специальное имя `:memory:` для создания базы данных в оперативной памяти.2324После получения [`Connection`](https://python-all.ru/2.7/library/multiprocessing.html#Connection) можно создать объект [`Cursor`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor) и вызвать его метод [`execute()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.execute) для выполнения SQL-команд:2526```python27c = conn.cursor()2829# Создать таблицу30c.execute('''CREATE TABLE stocks31 (date text, trans text, symbol text, qty real, price real)''')3233# Вставить строку данных34c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")3536# Сохранить (зафиксировать) изменения37conn.commit()3839# Также можно закрыть соединение, если работа с ним завершена.40# Все изменения должны быть зафиксированы, иначе они будут потеряны.41conn.close()42```4344Сохранённые данные являются постоянными и доступны в последующих сеансах:4546```python47import sqlite348conn = sqlite3.connect('example.db')49c = conn.cursor()50```5152Обычно в SQL-операциях требуется использовать значения из переменных Python. Не следует собирать запрос с помощью строковых операций Python, потому что это небезопасно; это делает программу уязвимой для атак SQL-инъекций (см. [https://xkcd.com/327/](https://python-all.ru/2.7/library/sqlite3.html) – забавный пример того, что может пойти не так).5354Вместо этого используется подстановка параметров DB-API. `?` ставится в качестве заполнителя там, где требуется значение, после чего кортеж значений передаётся вторым аргументом методу [`execute()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.execute) курсора. (Другие модули баз данных могут использовать другой заполнитель, например `%s` или `:1`.) Например:5556```python57# Никогда не делайте этого – это небезопасно!58symbol = 'RHAT'59c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)6061# Вместо этого сделайте так62t = ('RHAT',)63c.execute('SELECT * FROM stocks WHERE symbol=?', t)64print c.fetchone()6566# Более крупный пример, вставляющий много записей за один раз67purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),68 ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),69 ('2006-04-06', 'SELL', 'IBM', 500, 53.00),70 ]71c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)72```7374Чтобы получить данные после выполнения запроса SELECT, можно либо рассматривать курсор как [итератор](https://python-all.ru/2.7/glossary.html#term-iterator), вызвать метод [`fetchone()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.fetchone) курсора для получения одной подходящей строки, либо вызвать [`fetchall()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.fetchall) для получения списка подходящих строк.7576В этом примере используется форма итератора:7778```python79>>> for row in c.execute('SELECT * FROM stocks ORDER BY price'):80 print row8182(u'2006-01-05', u'BUY', u'RHAT', 100, 35.14)83(u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)84(u'2006-04-06', u'SELL', u'IBM', 500, 53.0)85(u'2006-04-05', u'BUY', u'MSFT', 1000, 72.0)86```8788> **См. также**89>90> **[https://github.com/ghaering/pysqlite](https://python-all.ru/2.7/library/sqlite3.html)**91>92> Страница pysqlite – sqlite3 разрабатывается отдельно под названием «pysqlite».93>94> **[https://www.sqlite.org](https://python-all.ru/2.7/library/sqlite3.html)**95>96> Веб-страница SQLite; документация описывает синтаксис и доступные типы данных поддерживаемого диалекта SQL.97>98> **[http://www.w3schools.com/sql/](https://python-all.ru/2.7/library/sqlite3.html)**99>100> Учебные материалы, справочник и примеры для изучения синтаксиса SQL.101>102> **[**PEP 249**](https://python-all.ru/2.7/library/sqlite3.html) – спецификация API баз данных 2.0**103>104> PEP написан Марком-Андре Лембургом.105106## 11.13.1. Функции и константы модуля107108#### `sqlite3.version`109110Номер версии этого модуля в виде строки. Это не версия библиотеки SQLite.111112#### `sqlite3.version_info`113114Номер версии этого модуля в виде кортежа целых чисел. Это не версия библиотеки SQLite.115116#### `sqlite3.sqlite_version`117118Номер версии библиотеки SQLite времени выполнения в виде строки.119120#### `sqlite3.sqlite_version_info`121122Номер версии библиотеки SQLite времени выполнения в виде кортежа целых чисел.123124#### `sqlite3.PARSE_DECLTYPES`125126Эта константа предназначена для использования с параметром *detect\_types* функции [`connect()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.connect).127128Установка этого флага заставляет модуль [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) анализировать объявленный тип для каждого возвращаемого столбца. Он выделит первое слово объявленного типа, т. е. для «integer primary key» выделит «integer», а для «number(10)» выделит «number». Затем для этого столбца он заглянет в словарь преобразователей и использует зарегистрированную там функцию преобразования для этого типа.129130#### `sqlite3.PARSE_COLNAMES`131132Эта константа предназначена для использования с параметром *detect\_types* функции [`connect()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.connect).133134Установка этого параметра заставляет интерфейс SQLite разбирать имена столбцов для каждого столбца, который он возвращает. Он будет искать строку вида \[mytype\] и на основании этого определять, что 'mytype' – это тип столбца. Затем он попытается найти запись 'mytype' в словаре конвертеров и использовать найденную функцию-конвертер для возврата значения. Имя столбца, найденное в [`Cursor.description`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.description), – это только первое слово имени столбца; то есть если используется что-то вроде `'as "x [datetime]"'` в SQL, то будет извлечено всё до первого пробела: именем столбца будет просто "x".135136#### `sqlite3.connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements])`137138Открывает соединение с файлом базы данных SQLite *database*. Можно использовать `":memory:"` для открытия соединения с базой данных, которая находится в оперативной памяти, вместо файла на диске.139140Когда к базе данных обращаются несколько соединений и один из процессов изменяет базу данных, база данных SQLite блокируется до завершения этой транзакции. Параметр *timeout* задаёт, как долго соединение должно ждать снятия блокировки, прежде чем возникнет исключение. Значение по умолчанию для параметра timeout – 5.0 (пять секунд).141142По поводу параметра *isolation\_level* обратитесь к свойству [`Connection.isolation_level`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.isolation_level) объектов [`Connection`](https://python-all.ru/2.7/library/multiprocessing.html#Connection).143144SQLite изначально поддерживает только типы TEXT, INTEGER, REAL, BLOB и NULL. Если вы хотите использовать другие типы, необходимо добавить поддержку самостоятельно. Параметр *detect\_types* и использование пользовательских **преобразователей**, зарегистрированных с помощью функции модуля [`register_converter()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.register_converter), позволяют легко это сделать.145146*detect\_types* по умолчанию равен 0 (т.е. выключен, определение типов не выполняется). Вы можете установить его в любую комбинацию [`PARSE_DECLTYPES`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.PARSE_DECLTYPES) и [`PARSE_COLNAMES`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.PARSE_COLNAMES), чтобы включить определение типов.147148По умолчанию модуль [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) использует свой класс [`Connection`](https://python-all.ru/2.7/library/multiprocessing.html#Connection) для вызова connect. Однако вы можете создать подкласс класса [`Connection`](https://python-all.ru/2.7/library/multiprocessing.html#Connection) и заставить [`connect()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.connect) использовать ваш класс, передав его в параметре *factory*.149150Подробности см. в разделе [Типы SQLite и Python](https://python-all.ru/2.7/library/sqlite3.html#sqlite3-types) данного руководства.151152Модуль [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) внутренне использует кэш операторов для снижения накладных расходов на разбор SQL. Если вы хотите явно задать количество операторов, кэшируемых для соединения, можно установить параметр *cached\_statements*. Текущая реализация по умолчанию кэширует 100 операторов.153154#### `sqlite3.register_converter(typename, callable)`155156Регистрирует вызываемый объект для преобразования байтовой строки из базы данных в пользовательский тип Python. Вызываемый объект будет вызываться для всех значений базы данных, имеющих тип *typename*. Смотрите параметр *detect\_types* функции [`connect()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.connect), чтобы узнать, как работает определение типа. Обратите внимание, что *typename* и имя типа в запросе сравниваются без учёта регистра.157158#### `sqlite3.register_adapter(type, callable)`159160Регистрирует вызываемый объект для преобразования пользовательского типа Python *type* в один из поддерживаемых типов SQLite. Вызываемый объект *callable* принимает в качестве единственного параметра значение Python и должен возвращать значение одного из следующих типов: int, long, float, str (в кодировке UTF-8), unicode или buffer.161162#### `sqlite3.complete_statement(sql)`163164Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если строка *sql* содержит одно или несколько полных SQL-выражений, завершающихся точкой с запятой. При этом не проверяется синтаксическая корректность SQL, только отсутствие незакрытых строковых литералов и завершение выражения точкой с запятой.165166Это можно использовать для создания оболочки для SQLite, как в следующем примере:167168```python169# Минимальная оболочка SQLite для экспериментов170171import sqlite3172173con = sqlite3.connect(":memory:")174con.isolation_level = None175cur = con.cursor()176177buffer = ""178179print "Enter your SQL commands to execute in sqlite3."180print "Enter a blank line to exit."181182while True:183 line = raw_input()184 if line == "":185 break186 buffer += line187 if sqlite3.complete_statement(buffer):188 try:189 buffer = buffer.strip()190 cur.execute(buffer)191192 if buffer.lstrip().upper().startswith("SELECT"):193 print cur.fetchall()194 except sqlite3.Error as e:195 print "An error occurred:", e.args[0]196 buffer = ""197198con.close()199```200201#### `sqlite3.enable_callback_tracebacks(flag)`202203По умолчанию трассировки не отображаются для пользовательских функций, агрегатов, преобразователей, колбэков авторизатора и т.д. Для отладки можно вызвать эту функцию, установив для *flag* значение `True`. После этого трассировки будут отображаться из колбэков на `sys.stderr`. Используйте [`False`](https://python-all.ru/2.7/library/constants.html#False), чтобы снова отключить эту возможность.204205## 11.13.2. Объекты соединений206207#### `class sqlite3.Connection`208209Соединение с базой данных SQLite обладает следующими атрибутами и методами:210211#### `isolation_level`212213Возвращает или задаёт текущий уровень изоляции. [`None`](https://python-all.ru/2.7/library/constants.html#None) для режима автоподтверждения или одно из значений «DEFERRED», «IMMEDIATE» или «EXCLUSIVE». Подробное объяснение см. в разделе [Управление транзакциями](https://python-all.ru/2.7/library/sqlite3.html#sqlite3-controlling-transactions).214215#### `cursor(factory=Cursor)`216217Метод cursor принимает один необязательный параметр *factory*. Если он указан, это должен быть вызываемый объект, возвращающий экземпляр [`Cursor`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor) или его подклассов.218219#### `commit()`220221Этот метод фиксирует текущую транзакцию. Если не вызвать этот метод, все изменения, сделанные после последнего вызова `commit()`, не будут видны из других подключений к базе данных. Если вы не видите данные, которые записали в базу, проверьте, не забыли ли вызвать этот метод.222223#### `rollback()`224225Этот метод откатывает все изменения в базе данных, сделанные после последнего вызова [`commit()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.commit).226227#### `close()`228229Это закрывает подключение к базе данных. Обратите внимание, что это не вызывает автоматически [`commit()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.commit). Если просто закрыть подключение к базе данных, не вызвав предварительно [`commit()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.commit), изменения будут потеряны!230231#### `execute(sql[, parameters])`232233Это нестандартное сокращение, которое создаёт промежуточный объект курсора путём вызова метода cursor, а затем вызывает метод [`execute`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.execute) курсора с переданными параметрами.234235#### `executemany(sql[, parameters])`236237Это нестандартное сокращение, которое создаёт промежуточный объект курсора путём вызова метода cursor, а затем вызывает метод [`executemany`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.executemany) курсора с переданными параметрами.238239#### `executescript(sql_script)`240241Это нестандартное сокращение, которое создаёт промежуточный объект курсора путём вызова метода cursor, а затем вызывает метод [`executescript`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.executescript) курсора с переданными параметрами.242243#### `create_function(name, num_params, func)`244245Создаёт пользовательскую функцию, которую затем можно использовать в SQL-выражениях под именем *name*. *num\_params* – количество параметров, принимаемых функцией, а *func* – вызываемый объект Python, который будет вызываться как SQL-функция.246247Функция может возвращать любой из типов, поддерживаемых SQLite: unicode, str, int, long, float, buffer и `None`.248249Пример:250251```python252import sqlite3253import md5254255def md5sum(t):256 return md5.md5(t).hexdigest()257258con = sqlite3.connect(":memory:")259con.create_function("md5", 1, md5sum)260cur = con.cursor()261cur.execute("select md5(?)", ("foo",))262print cur.fetchone()[0]263```264265#### `create_aggregate(name, num_params, aggregate_class)`266267Создаёт пользовательскую агрегатную функцию.268269Класс агрегатной функции должен реализовывать метод `step`, который принимает количество параметров *num\_params*, и метод `finalize`, который будет возвращать окончательный результат агрегации.270271Метод `finalize` может возвращать любой из типов, поддерживаемых SQLite: unicode, str, int, long, float, buffer и `None`.272273Пример:274275```python276import sqlite3277278class MySum:279 def __init__(self):280 self.count = 0281282 def step(self, value):283 self.count += value284285 def finalize(self):286 return self.count287288con = sqlite3.connect(":memory:")289con.create_aggregate("mysum", 1, MySum)290cur = con.cursor()291cur.execute("create table test(i)")292cur.execute("insert into test(i) values (1)")293cur.execute("insert into test(i) values (2)")294cur.execute("select mysum(i) from test")295print cur.fetchone()[0]296```297298#### `create_collation(name, callable)`299300Создаёт collation с указанными *name* и *callable*. Вызываемый объект будет получать два строковых аргумента. Он должен возвращать -1, если первый меньше второго, 0, если они равны, и 1, если первый больше второго. Обратите внимание, что это управляет сортировкой (ORDER BY в SQL), поэтому сравнения не влияют на другие операции SQL.301302Обратите внимание, что вызываемый объект будет получать свои параметры в виде байтовых строк Python, которые обычно закодированы в UTF-8.303304Следующий пример показывает пользовательскую коллацию, которая сортирует «в обратном порядке»:305306```python307import sqlite3308309def collate_reverse(string1, string2):310 return -cmp(string1, string2)311312con = sqlite3.connect(":memory:")313con.create_collation("reverse", collate_reverse)314315cur = con.cursor()316cur.execute("create table test(x)")317cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])318cur.execute("select x from test order by x collate reverse")319for row in cur:320 print row321con.close()322```323324Чтобы удалить коллацию, вызовите `create_collation` с `None` в качестве вызываемого объекта:325326```python327con.create_collation("reverse", None)328```329330#### `interrupt()`331332Этот метод можно вызвать из другого потока, чтобы прервать любые запросы, которые могут выполняться в подключении. Запрос будет прерван, а вызывающий код получит исключение.333334#### `set_authorizer(authorizer_callback)`335336Эта процедура регистрирует колбэк. Колбэк вызывается при каждой попытке доступа к столбцу таблицы в базе данных. Колбэк должен возвращать `SQLITE_OK`, если доступ разрешён, `SQLITE_DENY`, если весь SQL-запрос должен быть прерван с ошибкой, и `SQLITE_IGNORE`, если столбец должен рассматриваться как значение NULL. Эти константы доступны в модуле [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3).337338Первый аргумент колбэка указывает, какой тип операции требуется авторизовать. Второй и третий аргументы будут аргументами или [`None`](https://python-all.ru/2.7/library/constants.html#None) в зависимости от первого аргумента. Четвёртый аргумент – имя базы данных («main», «temp» и т.д.), если применимо. Пятый аргумент – имя самого внутреннего триггера или представления, ответственного за попытку доступа, или [`None`](https://python-all.ru/2.7/library/constants.html#None), если эта попытка доступа происходит непосредственно из входного SQL-кода.339340Обратитесь к документации SQLite за возможными значениями первого аргумента и значением второго и третьего аргументов в зависимости от первого. Все необходимые константы доступны в модуле [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3).341342#### `set_progress_handler(handler, n)`343344Эта процедура регистрирует колбэк. Колбэк вызывается каждые *n* инструкций виртуальной машины SQLite. Это полезно, если требуется получать вызовы от SQLite во время длительных операций, например для обновления графического интерфейса.345346Чтобы очистить ранее установленный обработчик прогресса, вызовите метод с [`None`](https://python-all.ru/2.7/library/constants.html#None) для *handler*.347348Новое в версии 2.6.349350#### `enable_load_extension(enabled)`351352Эта процедура разрешает или запрещает механизму SQLite загружать расширения SQLite из разделяемых библиотек. Расширения SQLite могут определять новые функции, агрегатные функции или целые реализации виртуальных таблиц. Одним из известных расширений является расширение полнотекстового поиска, распространяемое с SQLite.353354Загружаемые расширения по умолчанию отключены. См. [1](https://python-all.ru/2.7/library/sqlite3.html#f1).355356Новое в версии 2.7.357358```python359import sqlite3360361con = sqlite3.connect(":memory:")362363# включить загрузку расширений364con.enable_load_extension(True)365366# Загрузить расширение полнотекстового поиска.367con.execute("select load_extension('./fts3.so')")368369# в качестве альтернативы можно загрузить расширение с помощью вызова API:370# con.load_extension("./fts3.so")371372# отключить загрузку расширения снова373con.enable_load_extension(False)374375# пример из вики SQLite376con.execute("create virtual table recipe using fts3(name, ingredients)")377con.executescript("""378 insert into recipe (name, ingredients) values ('broccoli stew', 'broccoli peppers cheese tomatoes');379 insert into recipe (name, ingredients) values ('pumpkin stew', 'pumpkin onions garlic celery');380 insert into recipe (name, ingredients) values ('broccoli pie', 'broccoli cheese onions flour');381 insert into recipe (name, ingredients) values ('pumpkin pie', 'pumpkin sugar flour butter');382 """)383for row in con.execute("select rowid, name, ingredients from recipe where name match 'pie'"):384 print row385```386387#### `load_extension(path)`388389Эта процедура загружает расширение SQLite из разделяемой библиотеки. Перед использованием этой процедуры необходимо включить загрузку расширений с помощью [`enable_load_extension()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.enable_load_extension).390391Загружаемые расширения по умолчанию отключены. См. [1](https://python-all.ru/2.7/library/sqlite3.html#f1).392393Новое в версии 2.7.394395#### `row_factory`396397Этот атрибут можно заменить на вызываемый объект, который принимает курсор и исходную строку в виде кортежа и возвращает реальную результирующую строку. Таким образом можно реализовать более продвинутые способы возврата результатов, например возврат объекта, который также может обращаться к столбцам по имени.398399Пример:400401```python402import sqlite3403404def dict_factory(cursor, row):405 d = {}406 for idx, col in enumerate(cursor.description):407 d[col[0]] = row[idx]408 return d409410con = sqlite3.connect(":memory:")411con.row_factory = dict_factory412cur = con.cursor()413cur.execute("select 1 as a")414print cur.fetchone()["a"]415```416417Если возврата кортежа недостаточно и требуется доступ к столбцам по имени, рассмотрите возможность установки [`row_factory`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.row_factory) в высокооптимизированный тип [`sqlite3.Row`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Row). [`Row`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Row) обеспечивает как доступ по индексу, так и регистронезависимый доступ по имени с почти нулевыми накладными расходами памяти. Вероятно, это будет лучше, чем собственное решение на основе словаря или даже на основе db\_row.418419#### `text_factory`420421С помощью этого атрибута можно управлять тем, какие объекты возвращаются для типа данных `TEXT`. По умолчанию этот атрибут имеет значение [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode), и модуль [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) возвращает объекты Unicode для `TEXT`. Если вместо этого нужно возвращать байтовые строки, можно установить значение [`str`](https://python-all.ru/2.7/library/functions.html#str).422423Из соображений эффективности существует также способ возвращать объекты Unicode только для не-ASCII данных, а в остальных случаях – байтовые строки. Чтобы активировать это, установите данный атрибут в `sqlite3.OptimizedUnicode`.424425Также можно установить его в любой другой вызываемый объект, принимающий единственный параметр – байтовую строку и возвращающий результирующий объект.426427См. следующий пример для иллюстрации:428429```python430import sqlite3431432con = sqlite3.connect(":memory:")433cur = con.cursor()434435AUSTRIA = u"\xd6sterreich"436437# по умолчанию строки возвращаются как Unicode438cur.execute("select ?", (AUSTRIA,))439row = cur.fetchone()440assert row[0] == AUSTRIA441442# но можно заставить sqlite3 всегда возвращать байтовые строки...443con.text_factory = str444cur.execute("select ?", (AUSTRIA,))445row = cur.fetchone()446assert type(row[0]) is str447# байтовые строки будут в кодировке UTF-8, если только в базу не попал мусор448# база данных...449assert row[0] == AUSTRIA.encode("utf-8")450451# можно также реализовать собственный text_factory...452# здесь мы реализуем такой, который будет игнорировать символы Unicode, которые не могут быть453# декодированы из UTF-8454con.text_factory = lambda x: unicode(x, "utf-8", "ignore")455cur.execute("select ?", ("this is latin1 and would normally create errors" +456 u"\xe4\xf6\xfc".encode("latin1"),))457row = cur.fetchone()458assert type(row[0]) is unicode459460# sqlite3 предлагает встроенную оптимизированную text_factory, которая возвращает байтовые строки461# объекты, если данные только в ASCII, и в противном случае возвращает объекты Unicode462con.text_factory = sqlite3.OptimizedUnicode463cur.execute("select ?", (AUSTRIA,))464row = cur.fetchone()465assert type(row[0]) is unicode466467cur.execute("select ?", ("Germany",))468row = cur.fetchone()469assert type(row[0]) is str470```471472#### `total_changes`473474Возвращает общее количество строк базы данных, которые были изменены, вставлены или удалены с момента открытия подключения к базе данных.475476#### `iterdump`477478Возвращает итератор для дампа базы данных в текстовом формате SQL. Полезно при сохранении базы данных в памяти для последующего восстановления. Эта функция предоставляет те же возможности, что и команда `.dump` в оболочке **sqlite3**.479480Новое в версии 2.6.481482Пример:483484```python485# Преобразовать файл existing_db.db в SQL-дамп dump.sql486import sqlite3, os487488con = sqlite3.connect('existing_db.db')489with open('dump.sql', 'w') as f:490 for line in con.iterdump():491 f.write('%s\n' % line)492```493494## 11.13.3. Объекты курсора495496#### `class sqlite3.Cursor`497498Экземпляр [`Cursor`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor) имеет следующие атрибуты и методы.499500#### `execute(sql[, parameters])`501502Выполняет SQL-выражение. SQL-выражение может быть параметризованным (т. е. с использованием плейсхолдеров вместо литералов SQL). Модуль [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) поддерживает два вида плейсхолдеров: вопросительные знаки (стиль qmark) и именованные плейсхолдеры (именованный стиль).503504Вот пример обоих стилей:505506```python507import sqlite3508509con = sqlite3.connect(":memory:")510cur = con.cursor()511cur.execute("create table people (name_last, age)")512513who = "Yeltsin"514age = 72515516# Это стиль qmark:517cur.execute("insert into people values (?, ?)", (who, age))518519# А это именованный стиль:520cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})521522print cur.fetchone()523```524525[`execute()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.execute) выполнит только один SQL-оператор. Если попытаться выполнить им более одного оператора, будет возбуждено предупреждение (Warning). Используйте [`executescript()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.executescript), если требуется выполнить несколько SQL-операторов за один вызов.526527#### `executemany(sql, seq_of_parameters)`528529Выполняет SQL-команду для всех последовательностей или отображений параметров, найденных в последовательности *sql*. Модуль [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) также позволяет использовать [итератор](https://python-all.ru/2.7/glossary.html#term-iterator), возвращающий параметры, вместо последовательности.530531```python532import sqlite3533534class IterChars:535 def __init__(self):536 self.count = ord('a')537538 def __iter__(self):539 return self540541 def next(self):542 if self.count > ord('z'):543 raise StopIteration544 self.count += 1545 return (chr(self.count - 1),) # это кортеж из одного элемента546547con = sqlite3.connect(":memory:")548cur = con.cursor()549cur.execute("create table characters(c)")550551theIter = IterChars()552cur.executemany("insert into characters(c) values (?)", theIter)553554cur.execute("select c from characters")555print cur.fetchall()556```557558Вот более короткий пример с использованием [генератора](https://python-all.ru/2.7/glossary.html#term-generator):559560```python561import sqlite3562import string563564def char_generator():565 for c in string.lowercase:566 yield (c,)567568con = sqlite3.connect(":memory:")569cur = con.cursor()570cur.execute("create table characters(c)")571572cur.executemany("insert into characters(c) values (?)", char_generator())573574cur.execute("select c from characters")575print cur.fetchall()576```577578#### `executescript(sql_script)`579580Это нестандартный удобный метод для выполнения нескольких SQL-выражений за один раз. Сначала он выполняет оператор `COMMIT`, а затем выполняет SQL-скрипт, переданный в качестве параметра.581582*sql\_script* может быть байтовой строкой или строкой Unicode.583584Пример:585586```python587import sqlite3588589con = sqlite3.connect(":memory:")590cur = con.cursor()591cur.executescript("""592 create table person(593 firstname,594 lastname,595 age596 );597598 create table book(599 title,600 author,601 published602 );603604 insert into book(title, author, published)605 values (606 'Dirk Gently''s Holistic Detective Agency',607 'Douglas Adams',608 1987609 );610 """)611```612613#### `fetchone()`614615Извлекает следующую строку результата запроса, возвращая одну последовательность или [`None`](https://python-all.ru/2.7/library/constants.html#None), если данные закончились.616617#### `fetchmany([size=cursor.arraysize])`618619Извлекает следующий набор строк результата запроса, возвращая список. Пустой список возвращается, когда строк больше нет.620621Количество строк, извлекаемых за один вызов, задаётся параметром *size*. Если он не указан, количество строк определяется атрибутом arraysize курсора. Метод должен пытаться извлечь столько строк, сколько указано параметром size. Если это невозможно из-за того, что указанное количество строк недоступно, может быть возвращено меньше строк.622623Обратите внимание, что параметр *size* связан с производительностью. Для оптимальной производительности обычно лучше использовать атрибут arraysize. Если используется параметр *size*, рекомендуется сохранять одно и то же значение от одного вызова [`fetchmany()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.fetchmany) к следующему.624625#### `fetchall()`626627Извлекает все (оставшиеся) строки результата запроса, возвращая список. Обратите внимание, что атрибут arraysize курсора может влиять на производительность этой операции. Пустой список возвращается, если строк нет.628629#### `rowcount`630631Хотя класс [`Cursor`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor) модуля [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) реализует этот атрибут, собственная поддержка определения «затронутых строк»/«выбранных строк» в движке базы данных работает непредсказуемо.632633Для выражений [`executemany()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.executemany) количество изменений суммируется в [`rowcount`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.rowcount).634635В соответствии со спецификацией Python DB API, атрибут [`rowcount`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.rowcount) «равен -1, если над курсором не выполнялось `executeXX()` или количество строк последней операции не может быть определено интерфейсом». Это включает выражения `SELECT`, потому что количество строк, полученных запросом, нельзя определить, пока не будут извлечены все строки.636637В SQLite версий до 3.6.5 [`rowcount`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.rowcount) устанавливается в 0, если выполнить `DELETE FROM table` без условия.638639#### `lastrowid`640641Этот атрибут только для чтения возвращает rowid последней изменённой строки. Он устанавливается только при выполнении оператора `INSERT` с помощью метода [`execute()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.execute). Для операций, отличных от `INSERT`, или при вызове [`executemany()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.executemany), [`lastrowid`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.lastrowid) устанавливается в [`None`](https://python-all.ru/2.7/library/constants.html#None).642643#### `description`644645Этот атрибут только для чтения содержит имена столбцов последнего запроса. Для совместимости с Python DB API он возвращает 7-кортеж для каждого столбца, где последние шесть элементов каждого кортежа равны [`None`](https://python-all.ru/2.7/library/constants.html#None).646647Он также устанавливается для операторов `SELECT`, не имеющих подходящих строк.648649#### `connection`650651Этот атрибут только для чтения предоставляет [`Connection`](https://python-all.ru/2.7/library/multiprocessing.html#Connection) базы данных SQLite, используемый объектом [`Cursor`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor). Объект [`Cursor`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor), созданный вызовом [`con.cursor()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.cursor), будет иметь атрибут [`connection`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.connection), ссылающийся на *con*:652653```python654>>> con = sqlite3.connect(":memory:")655>>> cur = con.cursor()656>>> cur.connection == con657True658```659660## 11.13.4. Объекты строк661662#### `class sqlite3.Row`663664Экземпляр [`Row`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Row) служит высокооптимизированной [`row_factory`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.row_factory) для объектов [`Connection`](https://python-all.ru/2.7/library/multiprocessing.html#Connection). Он старается имитировать кортеж в большинстве своих возможностей.665666Он поддерживает доступ по имени столбца и индексу, итерацию, представление, проверку равенства и [`len()`](https://python-all.ru/2.7/library/functions.html#len).667668Если два объекта [`Row`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Row) имеют одинаковые столбцы и их члены равны, они считаются равными.669670Изменено в версии 2.6: Добавлена итерация и поддержка проверки на равенство (хешируемость).671672#### `keys()`673674Этот метод возвращает список имён столбцов. Сразу после запроса это первый элемент каждого кортежа в [`Cursor.description`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor.description).675676Новое в версии 2.6.677678Предположим, мы инициализируем таблицу, как в приведённом выше примере:679680```python681conn = sqlite3.connect(":memory:")682c = conn.cursor()683c.execute('''create table stocks684(date text, trans text, symbol text,685 qty real, price real)''')686c.execute("""insert into stocks687 values ('2006-01-05','BUY','RHAT',100,35.14)""")688conn.commit()689c.close()690```691692Теперь подключаем [`Row`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Row):693694```python695>>> conn.row_factory = sqlite3.Row696>>> c = conn.cursor()697>>> c.execute('select * from stocks')698<sqlite3.Cursor object at 0x7f4e7dd8fa80>699>>> r = c.fetchone()700>>> type(r)701<type 'sqlite3.Row'>702>>> r703(u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)704>>> len(r)7055706>>> r[2]707u'RHAT'708>>> r.keys()709['date', 'trans', 'symbol', 'qty', 'price']710>>> r['qty']711100.0712>>> for member in r:713... print member714...7152006-01-05716BUY717RHAT718100.071935.14720```721722## 11.13.5. Типы SQLite и Python723724### 11.13.5.1. Введение725726SQLite изначально поддерживает следующие типы: `NULL`, `INTEGER`, `REAL`, `TEXT`, `BLOB`.727728Следующие типы Python можно передавать в SQLite без каких-либо проблем:729730| Тип Python | Тип SQLite |731| --- | --- |732| [`None`](https://python-all.ru/2.7/library/constants.html#None) | `NULL` |733| [`int`](https://python-all.ru/2.7/library/functions.html#int) | `INTEGER` |734| [`long`](https://python-all.ru/2.7/library/functions.html#long) | `INTEGER` |735| [`float`](https://python-all.ru/2.7/library/functions.html#float) | `REAL` |736| [`str`](https://python-all.ru/2.7/library/functions.html#str) (в кодировке UTF-8) | `TEXT` |737| [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode) | `TEXT` |738| [`buffer`](https://python-all.ru/2.7/library/functions.html#buffer) | `BLOB` |739740Так по умолчанию типы SQLite преобразуются в типы Python:741742| Тип SQLite | Тип Python |743| --- | --- |744| `NULL` | [`None`](https://python-all.ru/2.7/library/constants.html#None) |745| `INTEGER` | [`int`](https://python-all.ru/2.7/library/functions.html#int) или [`long`](https://python-all.ru/2.7/library/functions.html#long), в зависимости от размера |746| `REAL` | [`float`](https://python-all.ru/2.7/library/functions.html#float) |747| `TEXT` | зависит от [`text_factory`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.text_factory), по умолчанию [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode) |748| `BLOB` | [`buffer`](https://python-all.ru/2.7/library/functions.html#buffer) |749750Система типов модуля [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) расширяема двумя способами: можно хранить дополнительные типы Python в базе данных SQLite с помощью адаптации объектов, а также можно позволить модулю [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) преобразовывать типы SQLite в различные типы Python с помощью конвертеров.751752### 11.13.5.2. Использование адаптеров для хранения дополнительных типов Python в базах данных SQLite753754Как было сказано ранее, SQLite изначально поддерживает лишь ограниченный набор типов. Чтобы использовать другие типы Python с SQLite, необходимо **адаптировать** их к одному из поддерживаемых модулем sqlite3 типов SQLite: NoneType, int, long, float, str, unicode, buffer.755756Существует два способа разрешить модулю [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) адаптировать пользовательский тип Python к одному из поддерживаемых.757758#### 11.13.5.2.1. Самостоятельная адаптация объекта759760Это хороший подход, если вы пишете класс сами. Предположим, у вас есть такой класс:761762```python763class Point(object):764 def __init__(self, x, y):765 self.x, self.y = x, y766```767768Теперь нужно сохранить точку в одном столбце SQLite. Сначала нужно выбрать один из поддерживаемых типов для представления точки. Давайте просто используем str и разделим координаты точкой с запятой. Затем нужно определить в классе метод `__conform__(self, protocol)`, который должен возвращать преобразованное значение. Параметр *протокол* будет равен `PrepareProtocol`.769770```python771import sqlite3772773class Point(object):774 def __init__(self, x, y):775 self.x, self.y = x, y776777 def __conform__(self, protocol):778 if protocol is sqlite3.PrepareProtocol:779 return "%f;%f" % (self.x, self.y)780781con = sqlite3.connect(":memory:")782cur = con.cursor()783784p = Point(4.0, -3.2)785cur.execute("select ?", (p,))786print cur.fetchone()[0]787```788789#### 11.13.5.2.2. Регистрация вызываемого адаптера790791Другой вариант – создать функцию, которая преобразует тип в строковое представление, и зарегистрировать её с помощью [`register_adapter()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.register_adapter).792793> **Примечание**794>795> Адаптируемый тип/класс должен быть [классом нового стиля](https://python-all.ru/2.7/glossary.html#term-new-style-class), т. е. он должен иметь [`object`](https://python-all.ru/2.7/library/functions.html#object) в качестве одного из своих базовых классов.796797```python798import sqlite3799800class Point(object):801 def __init__(self, x, y):802 self.x, self.y = x, y803804def adapt_point(point):805 return "%f;%f" % (point.x, point.y)806807sqlite3.register_adapter(Point, adapt_point)808809con = sqlite3.connect(":memory:")810cur = con.cursor()811812p = Point(4.0, -3.2)813cur.execute("select ?", (p,))814print cur.fetchone()[0]815```816817Модуль [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) имеет два адаптера по умолчанию для встроенных типов Python [`datetime.date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) и [`datetime.datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). Теперь предположим, что мы хотим сохранить объекты [`datetime.datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) не в формате ISO, а в виде временной метки Unix.818819```python820import sqlite3821import datetime, time822823def adapt_datetime(ts):824 return time.mktime(ts.timetuple())825826sqlite3.register_adapter(datetime.datetime, adapt_datetime)827828con = sqlite3.connect(":memory:")829cur = con.cursor()830831now = datetime.datetime.now()832cur.execute("select ?", (now,))833print cur.fetchone()[0]834```835836### 11.13.5.3. Преобразование значений SQLite в пользовательские типы Python837838Написание адаптера позволяет отправлять пользовательские типы Python в SQLite. Но чтобы сделать это действительно полезным, нужно обеспечить обратное преобразование из SQLite в Python.839840Вступают конвертеры.841842Вернемся к классу `Point`. Мы сохраняли координаты x и y, разделенные точкой с запятой, в виде строк в SQLite.843844Сначала определим функцию-конвертер, которая принимает строку в качестве параметра и создает из нее объект `Point`.845846> **Примечание**847>848> Функции преобразования **всегда** вызываются со строкой, независимо от того, под каким tипом данных значение было отправлено в SQLite.849850```python851def convert_point(s):852 x, y = map(float, s.split(";"))853 return Point(x, y)854```855856Теперь нужно сообщить модулю [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3), что выбираемые из базы данные на самом деле являются точкой. Есть два способа сделать это:857858- Неявно, через объявленный тип859- Явно, по имени колонки860861Оба способа описаны в разделе [Функции и константы модуля](https://python-all.ru/2.7/library/sqlite3.html#sqlite3-module-contents), в записях для констант [`PARSE_DECLTYPES`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.PARSE_DECLTYPES) и [`PARSE_COLNAMES`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.PARSE_COLNAMES).862863Следующий пример иллюстрирует оба подхода.864865```python866import sqlite3867868class Point(object):869 def __init__(self, x, y):870 self.x, self.y = x, y871872 def __repr__(self):873 return "(%f;%f)" % (self.x, self.y)874875def adapt_point(point):876 return "%f;%f" % (point.x, point.y)877878def convert_point(s):879 x, y = map(float, s.split(";"))880 return Point(x, y)881882# Зарегистрировать адаптер883sqlite3.register_adapter(Point, adapt_point)884885# Зарегистрировать конвертер886sqlite3.register_converter("point", convert_point)887888p = Point(4.0, -3.2)889890#########################891# 1) Использование объявленных типов892con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)893cur = con.cursor()894cur.execute("create table test(p point)")895896cur.execute("insert into test(p) values (?)", (p,))897cur.execute("select p from test")898print "with declared types:", cur.fetchone()[0]899cur.close()900con.close()901902#######################903# 1) Использование имён столбцов904con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)905cur = con.cursor()906cur.execute("create table test(p)")907908cur.execute("insert into test(p) values (?)", (p,))909cur.execute('select p as "p [point]" from test')910print "with column names:", cur.fetchone()[0]911cur.close()912con.close()913```914915### 11.13.5.4. Адаптеры и конвертеры по умолчанию916917В модуле datetime есть адаптеры по умолчанию для типов date и datetime. Они отправляются в SQLite как даты/временные метки в формате ISO.918919Преобразователи по умолчанию зарегистрированы под именем «date» для [`datetime.date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) и под именем «timestamp» для [`datetime.datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime).920921Таким образом, в большинстве случаев можно использовать даты и временные метки из Python без лишних усилий. Формат адаптеров также совместим с экспериментальными функциями даты/времени SQLite.922923Следующий пример демонстрирует это.924925```python926import sqlite3927import datetime928929con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)930cur = con.cursor()931cur.execute("create table test(d date, ts timestamp)")932933today = datetime.date.today()934now = datetime.datetime.now()935936cur.execute("insert into test(d, ts) values (?, ?)", (today, now))937cur.execute("select d, ts from test")938row = cur.fetchone()939print today, "=>", row[0], type(row[0])940print now, "=>", row[1], type(row[1])941942cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"')943row = cur.fetchone()944print "current_date", row[0], type(row[0])945print "current_timestamp", row[1], type(row[1])946```947948Если временная метка, хранящаяся в SQLite, имеет дробную часть длиннее 6 знаков, её значение будет усечено до микросекундной точности преобразователем временных меток.949950## 11.13.6. Управление транзакциями951952По умолчанию модуль [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) неявно начинает транзакции перед инструкцией языка манипулирования данными (DML) (т.е. `INSERT`/`UPDATE`/`DELETE`/`REPLACE`) и неявно фиксирует транзакции перед инструкцией, не являющейся DML и не являющейся запросом (т.е. любой, кроме `SELECT` или упомянутых выше).953954Итак, если внутри транзакции выполняется команда вроде `CREATE TABLE ...`, `VACUUM`, `PRAGMA`, модуль [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) неявно выполнит commit перед выполнением этой команды. Для этого есть две причины. Первая: некоторые из этих команд не работают внутри транзакций. Вторая: sqlite3 необходимо отслеживать состояние транзакции (активна транзакция или нет).955956Вы можете управлять тем, какие инструкции `BEGIN` sqlite3 неявно выполняет (или не выполняет вовсе) с помощью параметра *isolation\_level* вызова [`connect()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.connect) или с помощью свойства `isolation_level` соединений.957958Если вам нужен **режим автоматической фиксации**, установите `isolation_level` в `None`.959960В противном случае оставьте его по умолчанию, что приведет к простой инструкции “BEGIN”, или установите одно из поддерживаемых уровней изоляции SQLite: “DEFERRED”, “IMMEDIATE” или “EXCLUSIVE”.961962## 11.13.7. Эффективное использование [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3)963964### 11.13.7.1. Использование сокращённых методов965966Используя нестандартные методы `execute()`, `executemany()` и `executescript()` объекта [`Connection`](https://python-all.ru/2.7/library/multiprocessing.html#Connection), код можно писать более кратко, поскольку не нужно явно создавать (часто излишние) объекты [`Cursor`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor). Вместо этого объекты [`Cursor`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Cursor) создаются неявно, и эти сокращенные методы возвращают объекты курсора. Таким образом, можно выполнить оператор `SELECT` и итерироваться по нему напрямую, используя всего один вызов объекта [`Connection`](https://python-all.ru/2.7/library/multiprocessing.html#Connection).967968```python969import sqlite3970971persons = [972 ("Hugo", "Boss"),973 ("Calvin", "Klein")974 ]975976con = sqlite3.connect(":memory:")977978# Создать таблицу979con.execute("create table person(firstname, lastname)")980981# Заполнить таблицу982con.executemany("insert into person(firstname, lastname) values (?, ?)", persons)983984# Выводит содержимое таблицы.985for row in con.execute("select firstname, lastname from person"):986 print row987988print "I just deleted", con.execute("delete from person").rowcount, "rows"989```990991### 11.13.7.2. Доступ к столбцам по имени вместо индекса992993Одна из полезных возможностей модуля [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) – встроенный класс [`sqlite3.Row`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Row), предназначенный для использования в качестве фабрики строк.994995Строки, обёрнутые этим классом, можно получать как по индексу (как кортежи), так и по имени без учёта регистра:996997```python998import sqlite39991000con = sqlite3.connect(":memory:")1001con.row_factory = sqlite3.Row10021003cur = con.cursor()1004cur.execute("select 'John' as name, 42 as age")1005for row in cur:1006 assert row[0] == row["name"]1007 assert row["name"] == row["nAmE"]1008 assert row[1] == row["age"]1009 assert row[1] == row["AgE"]1010```10111012### 11.13.7.3. Использование соединения в качестве менеджера контекста10131014Новое в версии 2.6.10151016Объекты соединения можно использовать как менеджеры контекста, которые автоматически фиксируют или откатывают транзакции. В случае исключения транзакция откатывается; в противном случае транзакция фиксируется:10171018```python1019import sqlite310201021con = sqlite3.connect(":memory:")1022con.execute("create table person (id integer primary key, firstname varchar unique)")10231024# При успешном выполнении con.commit() вызывается автоматически.1025with con:1026 con.execute("insert into person(firstname) values (?)", ("Joe",))10271028# con.rollback() вызывается после завершения блока with с исключением,1029# исключение все равно возбуждается, и его необходимо перехватить1030try:1031 with con:1032 con.execute("insert into person(firstname) values (?)", ("Joe",))1033except sqlite3.IntegrityError:1034 print "couldn't add Joe twice"1035```10361037## 11.13.8. Часто встречающиеся проблемы10381039### 11.13.8.1. Многопоточность10401041В старых версиях SQLite были проблемы с совместным использованием соединений между потоками. Именно поэтому модуль Python запрещает совместное использование соединений и курсоров между потоками. Если всё же попытаться это сделать, во время выполнения будет возбуждено исключение.10421043Единственное исключение – вызов метода [`interrupt()`](https://python-all.ru/2.7/library/sqlite3.html#sqlite3.Connection.interrupt), который имеет смысл вызывать только из другого потока.10441045Сноски10461047**1([1](https://python-all.ru/2.7/library/sqlite3.html#id1),[2](https://python-all.ru/2.7/library/sqlite3.html#id2))**10481049Модуль sqlite3 по умолчанию собирается без поддержки загружаемых расширений, так как на некоторых платформах (в частности, Mac OS X) библиотеки SQLite скомпилированы без этой возможности. Чтобы включить поддержку загружаемых расширений, необходимо изменить setup.py и удалить строку, устанавливающую SQLITE\_OMIT\_LOAD\_EXTENSION.1050