sqlite3
— DB-API 2.0 интерфейс для баз данных SQLite¶
Исходный код: Lib/sqlite3/.
SQLite - это библиотека на языке C, которая обеспечивает легковесную базу данных на диске, не требующую отдельного серверного процесса и позволяющую обращаться к базе данных с помощью нестандартного варианта языка запросов SQL. Некоторые приложения могут использовать SQLite для внутреннего хранения данных. Также можно создать прототип приложения с использованием SQLite, а затем перенести код на более крупную базу данных, такую как PostgreSQL или Oracle.
Модуль sqlite3
был написан Герхардом Херингом. Он предоставляет интерфейс SQL, соответствующий спецификации DB-API 2.0, описанной в PEP 249, и требует SQLite 3.7.15 или новее.
Данный документ включает в себя четыре основных раздела:
Учебник учит, как использовать модуль
sqlite3
.Ссылка описывает классы и функции, определяемые этим модулем.
Руководства по эксплуатации подробно описывает, как выполнять конкретные задачи.
Пояснение содержит подробную информацию об управлении транзакциями.
См.также
- https://www.sqlite.org
Веб-страница SQLite; документация описывает синтаксис и доступные типы данных для поддерживаемого диалекта SQL.
- https://www.w3schools.com/sql/
Учебник, справочник и примеры для изучения синтаксиса SQL.
- PEP 249 - Спецификация API базы данных 2.0
PEP написан Марком-Андре Лембургом.
Учебник¶
В этом руководстве вы создадите базу данных фильмов Монти Пайтона, используя базовую функциональность sqlite3
. Оно предполагает фундаментальное понимание концепций баз данных, включая cursors и transactions.
Сначала нам нужно создать новую базу данных и открыть соединение с базой данных, чтобы sqlite3
мог работать с ней. Вызовите sqlite3.connect()
для создания соединения с базой данных tutorial.db
в текущем рабочем каталоге, неявно создавая его, если оно не существует:
import sqlite3
con = sqlite3.connect("tutorial.db")
Возвращаемый объект Connection
con
представляет собой соединение с базой данных на диске.
Для выполнения SQL-запросов и получения результатов из SQL-запросов нам понадобится курсор базы данных. Вызовите con.cursor()
для создания курсора Cursor
:
cur = con.cursor()
Теперь, когда у нас есть подключение к базе данных и курсор, мы можем создать таблицу базы данных movie
со столбцами для названия, года выпуска и оценки рецензии. Для простоты мы можем просто использовать имена столбцов в объявлении таблицы - благодаря функции flexible typing в SQLite указание типов данных необязательно. Выполните оператор CREATE TABLE
, вызвав cur.execute(...)
:
cur.execute("CREATE TABLE movie(title, year, score)")
Мы можем проверить, что новая таблица была создана, запросив встроенную в SQLite таблицу sqlite_master
, которая теперь должна содержать запись для определения таблицы movie
(подробнее см. The Schema Table). Выполните этот запрос, вызвав cur.execute(...)
, присвойте результат res
и вызовите res.fetchone()
для получения результирующей строки:
>>> res = cur.execute("SELECT name FROM sqlite_master")
>>> res.fetchone()
('movie',)
Мы видим, что таблица была создана, так как запрос возвращает tuple
, содержащий имя таблицы. Если мы запросим sqlite_master
для несуществующей таблицы spam
, res.fetchone()
вернет None
:
>>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='spam'")
>>> res.fetchone() is None
True
Теперь добавьте две строки данных, представленных в виде SQL-литералов, выполнив оператор INSERT
, снова вызвав cur.execute(...)
:
cur.execute("""
INSERT INTO movie VALUES
('Monty Python and the Holy Grail', 1975, 8.2),
('And Now for Something Completely Different', 1971, 7.5)
""")
Оператор INSERT
неявно открывает транзакцию, которая должна быть зафиксирована до сохранения изменений в базе данных (подробнее см. Контроль транзакций). Вызовите con.commit()
на объекте соединения для фиксации транзакции:
con.commit()
Мы можем проверить, что данные были вставлены правильно, выполнив запрос SELECT
. Используйте ставшую уже привычной команду cur.execute(...)
для присвоения результата в res
и вызовите res.fetchall()
для возврата всех результирующих строк:
>>> res = cur.execute("SELECT score FROM movie")
>>> res.fetchall()
[(8.2,), (7.5,)]
В результате получается list
из двух tuple
, по одному на строку, каждый из которых содержит значение score
этой строки.
Теперь вставьте еще три строки, вызвав cur.executemany(...)
:
data = [
("Monty Python Live at the Hollywood Bowl", 1982, 7.9),
("Monty Python's The Meaning of Life", 1983, 7.5),
("Monty Python's Life of Brian", 1979, 8.0),
]
cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)
con.commit() # Remember to commit the transaction after executing INSERT.
Обратите внимание, что для привязки ?
к запросу используются заполнители data
. Всегда используйте заполнители вместо string formatting для привязки значений Python к SQL-запросам, чтобы избежать SQL injection attacks (подробнее см. Использование заполнителей для привязки значений в SQL-запросах).
Мы можем проверить, что новые строки были вставлены, выполнив запрос SELECT
, на этот раз итерируя результаты запроса:
>>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):
... print(row)
(1971, 'And Now for Something Completely Different')
(1975, 'Monty Python and the Holy Grail')
(1979, "Monty Python's Life of Brian")
(1982, 'Monty Python Live at the Hollywood Bowl')
(1983, "Monty Python's The Meaning of Life")
Каждая строка представляет собой два элемента tuple
из (year, title)
, соответствующих столбцам, выбранным в запросе.
Наконец, проверьте, что база данных была записана на диск, вызвав con.close()
для закрытия существующего соединения, открыв новое соединение, создав новый курсор, а затем выполнив запрос к базе данных:
>>> con.close()
>>> new_con = sqlite3.connect("tutorial.db")
>>> new_cur = new_con.cursor()
>>> res = new_cur.execute("SELECT title, year FROM movie ORDER BY score DESC")
>>> title, year = res.fetchone()
>>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}')
The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975
Теперь вы создали базу данных SQLite с помощью модуля sqlite3
, вставили данные и извлекли значения из нее несколькими способами.
См.также
Руководства по эксплуатации для дальнейшего чтения:
Пояснение для получения подробной информации об управлении транзакциями.
Ссылка¶
Функции модуля¶
-
sqlite3.
connect
(database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=128, uri=False)¶ Откройте соединение с базой данных SQLite.
- Parameters
database (path-like object) – Путь к открываемому файлу базы данных. Передайте
":memory:"
, чтобы открыть соединение с базой данных, которая находится в оперативной памяти, а не на диске.timeout (float) – Сколько секунд соединение должно подождать, прежде чем поднять исключение, если база данных заблокирована другим соединением. Если другое соединение открывает транзакцию для изменения базы данных, она будет заблокирована до тех пор, пока транзакция не будет зафиксирована. По умолчанию 5 секунд.
detect_types (int) – Управляет тем, ищутся ли типы данных, не относящиеся к natively supported by SQLite, и как они преобразуются в типы Python, используя конвертеры, зарегистрированные в
register_converter()
. Установите любое сочетание (используя|
, побитовое или)PARSE_DECLTYPES
иPARSE_COLNAMES
, чтобы включить это. Имена столбцов имеют приоритет над объявленными типами, если оба флага установлены. Типы не могут быть определены для сгенерированных полей (например,max(data)
), даже если установлен параметр detect_types; вместо него будет возвращеноstr
. По умолчанию (0
) определение типов отключено.isolation_level (str | None) – Параметр
isolation_level
соединения, контролирующий, открываются ли транзакции неявно и как. Может быть"DEFERRED"
(по умолчанию),"EXCLUSIVE"
или"IMMEDIATE"
; илиNone
для отключения неявного открытия транзакций. Подробнее см. в разделе Контроль транзакций.check_same_thread (bool) – Если
True
(по умолчанию), только создающий поток может использовать соединение. ЕслиFalse
, соединение может быть общим для нескольких потоков; в этом случае операции записи должны быть сериализованы пользователем во избежание повреждения данных.factory (Connection) – Пользовательский подкласс
Connection
для создания соединения, если не используется класс по умолчаниюConnection
.cached_statements (int) – Количество утверждений, которые
sqlite3
должен внутренне кэшировать для этого соединения, чтобы избежать накладных расходов на разбор. По умолчанию - 100 высказываний.uri (bool) – Если установлено значение
True
, database интерпретируется как URI с путем к файлу и необязательной строкой запроса. Часть схемы должна быть"file:"
, а путь может быть относительным или абсолютным. Строка запроса позволяет передавать SQLite параметры, позволяющие использовать различные Работа с URIs SQLite.
- Result type
Вызывает auditing event
sqlite3.connect
с аргументомdatabase
.Вызывает auditing event
sqlite3.connect/handle
с аргументомconnection_handle
.Добавлено в версии 3.4: Параметр uri.
Изменено в версии 3.7: Теперь database может быть не только строкой, но и path-like object.
Добавлено в версии 3.10: Событие аудита
sqlite3.connect/handle
.
-
sqlite3.
complete_statement
(statement)¶ Возвращает
True
, если строка statement содержит один или несколько полных операторов SQL. Синтаксическая проверка или синтаксический разбор не выполняются, кроме проверки отсутствия незакрытых строковых литералов и завершения утверждения точкой с запятой.Например:
>>> sqlite3.complete_statement("SELECT foo FROM bar;") True >>> sqlite3.complete_statement("SELECT foo") False
Эта функция может быть полезна во время ввода командной строки, чтобы определить, кажется ли введенный текст полным SQL-оператором, или требуется дополнительный ввод перед вызовом
execute()
.
-
sqlite3.
enable_callback_tracebacks
(flag, /)¶ Включить или отключить отслеживание обратных вызовов. По умолчанию вы не будете получать никаких обратных ссылок в пользовательских функциях, агрегатах, конвертерах, обратных ссылках авторизатора и т.д. Если вы хотите отладить их, вы можете вызвать эту функцию с flag, установленным в
True
. После этого вы получите трассировку от обратных вызовов наsys.stderr
. ИспользуйтеFalse
, чтобы снова отключить функцию.
-
sqlite3.
register_adapter
(type, adapter, /)¶ Зарегистрируйте вызываемый адаптер для адаптации типа Python type в тип SQLite. Адаптер вызывается с объектом Python типа type в качестве единственного аргумента и должен возвращать значение type that SQLite natively understands.
-
sqlite3.
register_converter
(typename, converter, /)¶ Зарегистрируйте вызываемый конвертер для преобразования объектов SQLite типа typename в объект Python определенного типа. Конвертер вызывается для всех значений SQLite типа typename; ему передается объект
bytes
и он должен вернуть объект нужного типа Python. Обратитесь к параметру detect_types изconnect()
для получения информации о том, как работает определение типов.Примечание: typename и имя типа в вашем запросе сопоставляются без учета регистра.
Константы модуля¶
-
sqlite3.
PARSE_COLNAMES
¶ Передайте значение этого флага в параметр detect_types команды
connect()
для поиска функции конвертера, используя имя типа, разобранное из имени столбца запроса, в качестве ключа словаря конвертера. Имя типа должно быть заключено в квадратные скобки ([]
).SELECT p as "p [point]" FROM test; ! will look up converter "point"
Этот флаг может быть объединен с
PARSE_DECLTYPES
с помощью оператора|
(побитовое или).
-
sqlite3.
PARSE_DECLTYPES
¶ Передайте значение этого флага параметру detect_types в
connect()
, чтобы найти функцию конвертера, используя объявленные типы для каждого столбца. Типы объявляются при создании таблицы базы данных.sqlite3
будет искать функцию конвертера, используя первое слово объявленного типа в качестве ключа словаря конвертера. Например:CREATE TABLE test( i integer primary key, ! will look up a converter named "integer" p point, ! will look up a converter named "point" n number(10) ! will look up a converter named "number" )
Этот флаг может быть объединен с
PARSE_COLNAMES
с помощью оператора|
(побитовое или).
-
sqlite3.
SQLITE_OK
¶ -
sqlite3.
SQLITE_DENY
¶ -
sqlite3.
SQLITE_IGNORE
¶ Флаги, которые должны быть возвращены вызываемой переменной authorizer_callback, переданной в
Connection.set_authorizer()
, чтобы указать, является ли:Доступ разрешен (
SQLITE_OK
),Оператор SQL должен быть прерван с ошибкой (
SQLITE_DENY
)Столбец должен рассматриваться как значение
NULL
(SQLITE_IGNORE
)
-
sqlite3.
apilevel
¶ Строковая константа, указывающая на поддерживаемый уровень DB-API. Требуется DB-API. Жестко закодирована в
"2.0"
.
-
sqlite3.
paramstyle
¶ Строковая константа, указывающая тип форматирования маркера параметра, ожидаемый модулем
sqlite3
. Требуется DB-API. Жестко закодирована в"qmark"
.Примечание
Модуль
sqlite3
поддерживает оба стиля параметровqmark
иnumeric
DB-API, поскольку именно это поддерживает базовая библиотека SQLite. Однако DB-API не позволяет использовать несколько значений для атрибутаparamstyle
.
-
sqlite3.
threadsafety
¶ Целочисленная константа, требуемая DB-API, указывающая уровень безопасности потоков, поддерживаемый модулем
sqlite3
. В настоящее время жестко закодирована в1
, что означает «Потоки могут совместно использовать модуль, но не соединения». Однако это не всегда верно. Вы можете проверить потоковый режим библиотеки SQLite во время компиляции, используя следующий запрос:import sqlite3 con = sqlite3.connect(":memory:") con.execute(""" select * from pragma_compile_options where compile_options like 'THREADSAFE=%' """).fetchall()
Обратите внимание, что SQLITE_THREADSAFE levels не соответствуют уровням DB-API 2.0
threadsafety
.
Объекты подключения¶
-
class
sqlite3.
Connection
¶ Каждая открытая база данных SQLite представлена объектом
Connection
, который создается с помощьюsqlite3.connect()
. Их основное назначение - создание объектовCursor
, а также Контроль транзакций.См.также
Подключение к базе данных SQLite имеет следующие атрибуты и методы:
-
isolation_level
¶ Этот атрибут управляет transaction handling, выполняемым
sqlite3
. Если установлено значениеNone
, транзакции никогда не открываются неявно. Если установлено одно из"DEFERRED"
,"IMMEDIATE"
или"EXCLUSIVE"
, соответствующее базовому SQLite transaction behaviour, выполняется неявное transaction management.Если параметр isolation_level не переопределен параметром
connect()
, по умолчанию используется""
, который является псевдонимом для"DEFERRED"
.
-
in_transaction
¶ Этот атрибут, доступный только для чтения, соответствует низкоуровневому SQLite autocommit mode.
True
если транзакция активна (есть незафиксированные изменения),False
в противном случае.Добавлено в версии 3.2.
-
row_factory
¶ Вызываемый объект, который принимает два аргумента, объект
Cursor
и необработанные результаты строк в видеtuple
, и возвращает пользовательский объект, представляющий строку SQLite.Пример:
import sqlite3 def dict_factory(cursor, row): d = {} for idx, col in enumerate(cursor.description): d[col[0]] = row[idx] return d con = sqlite3.connect(":memory:") con.row_factory = dict_factory cur = con.cursor() cur.execute("select 1 as a") print(cur.fetchone()["a"]) con.close()
Если возврата кортежа недостаточно и вам нужен доступ к столбцам на основе имен, вам следует установить
row_factory
в высоко оптимизированный типsqlite3.Row
.Row
обеспечивает доступ к столбцам как на основе индексов, так и на основе имен без учета регистра почти без затрат памяти. Это, вероятно, будет лучше, чем ваш собственный подход на основе словаря или даже решение на основе db_row.
-
text_factory
¶ Вызываемая переменная, которая принимает параметр
bytes
и возвращает его текстовое представление. Callable вызывается для значений SQLite с типом данныхTEXT
. По умолчанию этот атрибут установлен вstr
. Если вы хотите возвращатьbytes
вместо этого, установите text_factory вbytes
.Пример:
import sqlite3 con = sqlite3.connect(":memory:") cur = con.cursor() AUSTRIA = "Österreich" # by default, rows are returned as str cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() assert row[0] == AUSTRIA # but we can make sqlite3 always return bytestrings ... con.text_factory = bytes cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() assert type(row[0]) is bytes # the bytestrings will be encoded in UTF-8, unless you stored garbage in the # database ... assert row[0] == AUSTRIA.encode("utf-8") # we can also implement a custom text_factory ... # here we implement one that appends "foo" to all strings con.text_factory = lambda x: x.decode("utf-8") + "foo" cur.execute("select ?", ("bar",)) row = cur.fetchone() assert row[0] == "barfoo" con.close()
-
total_changes
¶ Возвращает общее количество строк базы данных, которые были изменены, вставлены или удалены с момента открытия соединения с базой данных.
-
cursor
(factory=Cursor)¶ Создать и вернуть объект
Cursor
. Метод cursor принимает один необязательный параметр factory. Если он задан, то это должен быть вызываемый объект, возвращающий экземплярCursor
или его подклассы.
-
commit
()¶ Зафиксировать любую незавершенную транзакцию в базе данных. Если нет открытой транзакции, этот метод не работает.
-
rollback
()¶ Откат к началу любой незавершенной транзакции. Если нет открытой транзакции, этот метод не работает.
-
close
()¶ Закройте соединение с базой данных. Любая незавершенная транзакция не фиксируется неявно; убедитесь, что
commit()
перед закрытием, чтобы избежать потери незавершенных изменений.
-
execute
(sql, parameters=(), /)¶ Создайте новый объект
Cursor
и вызовите на немexecute()
с заданными sql и параметрами. Верните новый объект курсора.
-
executemany
(sql, parameters, /)¶ Создайте новый объект
Cursor
и вызовите на немexecutemany()
с заданными sql и параметрами. Верните новый объект курсора.
-
executescript
(sql_script, /)¶ Создайте новый объект
Cursor
и вызовите на немexecutescript()
с заданным sql_script. Верните новый объект курсора.
-
create_function
(name, narg, func, \*, deterministic=False)¶ Создайте или удалите определяемую пользователем функцию SQL.
- Parameters
name (str) – Имя функции SQL.
narg (int) – Количество аргументов, которые может принимать функция SQL. Если
-1
, она может принимать любое количество аргументов.func (callback | None) – Вызываемая переменная, которая вызывается при вызове функции SQL. Вызываемая функция должна возвращать a type natively supported by SQLite. Установите значение
None
для удаления существующей SQL-функции.deterministic (bool) – Если
True
, созданная SQL-функция помечается как deterministic, что позволяет SQLite выполнять дополнительную оптимизацию.
- Exception
NotSupportedError – Если deterministic используется с версиями SQLite старше 3.8.3.
Добавлено в версии 3.8: Параметр детерминированности.
Пример:
import sqlite3 import hashlib def md5sum(t): return hashlib.md5(t).hexdigest() con = sqlite3.connect(":memory:") con.create_function("md5", 1, md5sum) cur = con.cursor() cur.execute("select md5(?)", (b"foo",)) print(cur.fetchone()[0]) con.close()
-
create_aggregate
(name, /, n_arg, aggregate_class)¶ Создание или удаление определяемой пользователем агрегатной функции SQL.
- Parameters
name (str) – Имя агрегатной функции SQL.
n_arg (int) – Количество аргументов, которые может принимать агрегатная функция SQL. Если
-1
, она может принимать любое количество аргументов.aggregate_class (class | None) – Класс должен реализовывать следующие методы: *
step()
: Добавить строку в агрегат. *finalize()
: Возвращать конечный результат агрегата в виде a type natively supported by SQLite. Количество аргументов, которые должен принимать методstep()
, контролируется параметром n_arg. Установите значениеNone
для удаления существующей агрегатной функции SQL.
Пример:
import sqlite3 class MySum: def __init__(self): self.count = 0 def step(self, value): self.count += value def finalize(self): return self.count con = sqlite3.connect(":memory:") con.create_aggregate("mysum", 1, MySum) cur = con.cursor() cur.execute("create table test(i)") cur.execute("insert into test(i) values (1)") cur.execute("insert into test(i) values (2)") cur.execute("select mysum(i) from test") print(cur.fetchone()[0]) con.close()
-
create_collation
(name, callable)¶ Создайте колляцию с именем name, используя функцию колляции callable. callable передается два аргумента
string
, и она должна вернутьinteger
:1
если первый порядок выше второго-1
если первый порядок ниже второго0
если они упорядочены одинаково
В следующем примере показана сортировка с обратной сортировкой:
import sqlite3 def collate_reverse(string1, string2): if string1 == string2: return 0 elif string1 < string2: return 1 else: return -1 con = sqlite3.connect(":memory:") con.create_collation("reverse", collate_reverse) cur = con.cursor() cur.execute("create table test(x)") cur.executemany("insert into test(x) values (?)", [("a",), ("b",)]) cur.execute("select x from test order by x collate reverse") for row in cur: print(row) con.close()
Удалите функцию collation, установив значение callable в
None
.
-
interrupt
()¶ Вызовите этот метод из другого потока, чтобы прервать все запросы, которые могут выполняться на соединении. Прерванные запросы вызовут исключение.
Зарегистрируйте вызываемый authorizer_callback, который будет вызываться при каждой попытке доступа к столбцу таблицы в базе данных. Обратный вызов должен возвращать одно из
SQLITE_OK
,SQLITE_DENY
илиSQLITE_IGNORE
, сигнализируя о том, как доступ к столбцу должен обрабатываться базовой библиотекой SQLite.Первый аргумент обратного вызова указывает, какая операция должна быть авторизована. Второй и третий аргументы будут аргументами или
None
в зависимости от первого аргумента. 4-й аргумент - это имя базы данных («main», «temp» и т.д.), если применимо. 5-й аргумент - имя самого внутреннего триггера или представления, ответственного за попытку доступа, илиNone
, если эта попытка доступа происходит непосредственно из входного SQL-кода.О возможных значениях первого аргумента и значении второго и третьего аргументов в зависимости от первого можно узнать из документации SQLite. Все необходимые константы доступны в модуле
sqlite3
.
-
set_progress_handler
(progress_handler, n)¶ Зарегистрируйте вызываемый progress_handler, который будет вызываться на каждые n инструкций виртуальной машины SQLite. Это полезно, если вы хотите получать вызовы от SQLite во время выполнения длительных операций, например, для обновления графического интерфейса.
Если вы хотите очистить любой ранее установленный обработчик прогресса, вызовите метод с
None
для progress_handler.Возврат ненулевого значения из функции обработчика прервет текущий выполняющийся запрос и вызовет исключение
OperationalError
.
-
set_trace_callback
(trace_callback)¶ Зарегистрируйте вызываемый trace_callback, который будет вызываться для каждого оператора SQL, фактически выполняемого бэкендом SQLite.
Единственным аргументом, передаваемым обратному вызову, является выполняемый оператор (в виде
str
). Возвращаемое значение обратного вызова игнорируется. Обратите внимание, что бэкенд выполняет не только утверждения, переданные в методыCursor.execute()
. Другие источники включают transaction management модуляsqlite3
и выполнение триггеров, определенных в текущей базе данных.Передача
None
в качестве trace_callback отключит обратный вызов трассировки.Примечание
Исключения, вызванные в обратном вызове трассировки, не распространяются. В качестве помощи при разработке и отладке используйте
enable_callback_tracebacks()
, чтобы включить печать обратных ссылок на исключения, поднятые в обратном вызове трассировки.Добавлено в версии 3.3.
-
enable_load_extension
(enabled, /)¶ Разрешите движку SQLite загружать расширения SQLite из общих библиотек, если enabled равно
True
; в противном случае запретите загрузку расширений SQLite. Расширения SQLite могут определять новые функции, агрегаты или совершенно новые реализации виртуальных таблиц. Одним из известных расширений является расширение полнотекстового поиска, распространяемое вместе с SQLite.Примечание
Модуль
sqlite3
по умолчанию не собирается с поддержкой загружаемых расширений, поскольку на некоторых платформах (в частности, macOS) библиотеки SQLite компилируются без этой возможности. Чтобы получить поддержку загружаемых расширений, необходимо передать опцию--enable-loadable-sqlite-extensions
в configure.Вызывает auditing event
sqlite3.enable_load_extension
с аргументамиconnection
,enabled
.Добавлено в версии 3.2.
Изменено в версии 3.10: Добавлено событие аудита
sqlite3.enable_load_extension
.import sqlite3 con = sqlite3.connect(":memory:") # enable extension loading con.enable_load_extension(True) # Load the fulltext search extension con.execute("select load_extension('./fts3.so')") # alternatively you can load the extension using an API call: # con.load_extension("./fts3.so") # disable extension loading again con.enable_load_extension(False) # example from SQLite wiki con.execute("create virtual table recipe using fts3(name, ingredients)") con.executescript(""" insert into recipe (name, ingredients) values ('broccoli stew', 'broccoli peppers cheese tomatoes'); insert into recipe (name, ingredients) values ('pumpkin stew', 'pumpkin onions garlic celery'); insert into recipe (name, ingredients) values ('broccoli pie', 'broccoli cheese onions flour'); insert into recipe (name, ingredients) values ('pumpkin pie', 'pumpkin sugar flour butter'); """) for row in con.execute("select rowid, name, ingredients from recipe where name match 'pie'"): print(row) con.close()
-
load_extension
(path, /)¶ Загрузите расширение SQLite из разделяемой библиотеки, расположенной по адресу path. Перед вызовом этого метода включите загрузку расширения командой
enable_load_extension()
.Вызывает auditing event
sqlite3.load_extension
с аргументамиconnection
,path
.Добавлено в версии 3.2.
Изменено в версии 3.10: Добавлено событие аудита
sqlite3.load_extension
.
-
iterdump
()¶ Возвращает iterator для дампа базы данных в виде исходного кода SQL. Полезно при сохранении базы данных в памяти для последующего восстановления. Аналогично команде
.dump
в оболочке sqlite3.Пример:
# Convert file existing_db.db to SQL dump file dump.sql import sqlite3 con = sqlite3.connect('existing_db.db') with open('dump.sql', 'w') as f: for line in con.iterdump(): f.write('%s\n' % line) con.close()
-
backup
(target, \*, pages=-1, progress=None, name="main", sleep=0.250)¶ Создайте резервную копию базы данных SQLite.
Работает, даже если к базе данных обращаются другие клиенты или одновременно по одному и тому же соединению.
- Parameters
target (Connection) – Подключение к базе данных для сохранения резервной копии.
pages (int) – Количество страниц, копируемых за один раз. Если равно или меньше
0
, вся база данных копируется за один шаг. По умолчанию установлено значение-1
.progress (callback | None) – Если задан как вызываемый, то вызывается с тремя целочисленными аргументами для каждой итерации резервного копирования: статус последней итерации, оставшееся количество страниц, которые еще предстоит скопировать, и общее количество страниц. По умолчанию имеет значение
None
.name (str) – Имя базы данных для резервного копирования. Либо
"main"
(по умолчанию) для основной базы данных,"temp"
для временной базы данных, либо имя пользовательской базы данных, присоединенное с помощью SQL-оператораATTACH DATABASE
.sleep (float) – Количество секунд сна между последовательными попытками резервного копирования оставшихся страниц.
Пример 1, копирование существующей базы данных в другую:
import sqlite3 def progress(status, remaining, total): print(f'Copied {total-remaining} of {total} pages...') con = sqlite3.connect('existing_db.db') bck = sqlite3.connect('backup.db') with bck: con.backup(bck, pages=1, progress=progress) bck.close() con.close()
Пример 2, копирование существующей базы данных в переходную копию:
import sqlite3 source = sqlite3.connect('existing_db.db') dest = sqlite3.connect(':memory:') source.backup(dest)
Добавлено в версии 3.7.
-
Объекты курсора¶
Объект
Cursor
представляет собой database cursor, который используется для выполнения SQL-запросов и управления контекстом операции выборки. Курсоры создаются с помощьюConnection.cursor()
или с помощью любого из connection shortcut methods.Объекты курсора являются iterators, что означает, что если вы
execute()
составите запросSELECT
, вы можете просто выполнить итерацию над курсором, чтобы получить результирующие строки:for row in cur.execute("select * from data"): print(row)
-
class
sqlite3.
Cursor
¶ Экземпляр
Cursor
имеет следующие атрибуты и методы.-
execute
(sql, parameters=(), /)¶ Выполните SQL-оператор sql. Привяжите значения к оператору с помощью placeholders, которые отображаются на sequence или
dict
параметры.execute()
выполнит только один оператор SQL. Если вы попытаетесь выполнить с его помощью более одного оператора, он выдаст ошибкуWarning
. Используйтеexecutescript()
, если вы хотите выполнить несколько операторов SQL одним вызовом.Если
isolation_level
неNone
, sql является операторомINSERT
,UPDATE
,DELETE
илиREPLACE
, и нет открытой транзакции, транзакция неявно открывается перед выполнением sql.
-
executemany
(sql, parameters, /)¶ Выполнить parameterized SQL-оператор sql против всех последовательностей параметров или отображений, найденных в последовательности параметров. Также можно использовать iterator, передающий параметры вместо последовательности. Использует ту же неявную обработку транзакций, что и
execute()
.Пример:
data = [ ("row1",), ("row2",), ] # cur is an sqlite3.Cursor object cur.executemany("insert into t values(?)", data)
-
executescript
(sql_script, /)¶ Выполнение операторов SQL в sql_script. Если есть незавершенная транзакция, сначала выполняется неявный оператор
COMMIT
. Никакого другого неявного контроля транзакций не выполняется; любой контроль транзакций должен быть добавлен в sql_script.sql_script должен быть
string
.Пример:
# cur is an sqlite3.Cursor object cur.executescript(""" begin; create table person(firstname, lastname, age); create table book(title, author, published); create table publisher(name, address); commit; """)
-
fetchone
()¶ Возвращает следующую строку набора результатов запроса в виде
tuple
. ВернитеNone
, если больше нет данных.
-
fetchmany
(size=cursor.arraysize)¶ Возвращает следующий набор строк результата запроса в виде
list
. Верните пустой список, если больше нет доступных строк.Количество строк для выборки за один вызов задается параметром size. Если size не задан,
arraysize
определяет количество строк, которые будут извлечены. Если доступно меньше, чем size, возвращается столько строк, сколько доступно.Обратите внимание, что параметр size связан с соображениями производительности. Для оптимальной производительности обычно лучше использовать атрибут arraysize. Если используется параметр size, то лучше всего, чтобы он сохранял одно и то же значение от одного вызова
fetchmany()
к другому.
-
fetchall
()¶ Возвращает все (оставшиеся) строки результата запроса в виде
list
. Верните пустой список, если нет ни одной строки. Обратите внимание, что атрибутarraysize
может повлиять на производительность этой операции.
-
close
()¶ Закрывайте курсор сейчас (а не при каждом вызове
__del__
).С этого момента курсор становится непригодным для использования; при попытке выполнения любой операции с курсором будет вызвано исключение
ProgrammingError
.
-
setinputsizes
(sizes, /)¶ Требуется DB-API. Ничего не делает в
sqlite3
.
-
setoutputsize
(size, column=None, /)¶ Требуется DB-API. Ничего не делает в
sqlite3
.
-
rowcount
¶ Атрибут только для чтения, который предоставляет количество измененных строк для операторов
INSERT
,UPDATE
,DELETE
иREPLACE
; является-1
для других операторов, включая CTE запросы. Он обновляется только методамиexecute()
иexecutemany()
.
-
lastrowid
¶ Атрибут, доступный только для чтения, который предоставляет идентификатор последней вставленной строки. Он обновляется только после успешных утверждений
INSERT
илиREPLACE
, использующих методexecute()
. Для других утверждений, послеexecutemany()
илиexecutescript()
, или если вставка не удалась, значениеlastrowid
остается неизменным. Начальным значениемlastrowid
являетсяNone
.Примечание
Вставки в таблицы
WITHOUT ROWID
не записываются.Изменено в версии 3.6: Добавлена поддержка оператора
REPLACE
.
-
arraysize
¶ Атрибут чтения/записи, который управляет количеством строк, возвращаемых
fetchmany()
. Значение по умолчанию равно 1, что означает, что за один вызов будет получен один ряд.
-
description
¶ Атрибут только для чтения, который предоставляет имена столбцов последнего запроса. Чтобы сохранить совместимость с API Python DB, он возвращает 7 кортежей для каждого столбца, где последние шесть элементов каждого кортежа являются
None
.Он устанавливается и для операторов
SELECT
без совпадающих строк.
-
connection
¶ Атрибут только для чтения, который предоставляет базу данных SQLite
Connection
, принадлежащую курсору. ОбъектCursor
, созданный вызовомcon.cursor()
, будет иметь атрибутconnection
, который ссылается на con:>>> con = sqlite3.connect(":memory:") >>> cur = con.cursor() >>> cur.connection == con True
-
Строковые объекты¶
-
class
sqlite3.
Row
¶ Экземпляр
Row
служит в качестве высоко оптимизированногоrow_factory
для объектовConnection
. Он поддерживает итерацию, проверку равенства,len()
и mapping доступ по имени столбца и индексу.Два строковых объекта сравниваются равными, если имеют равные столбцы и равные члены.
-
keys
()¶ Возвращает
list
имен столбцов в видеstrings
. Сразу после запроса он является первым членом каждого кортежа вCursor.description
.
Изменено в версии 3.5: Добавлена поддержка нарезки.
Пример:
>>> con = sqlite3.connect(":memory:") >>> con.row_factory = sqlite3.Row >>> res = con.execute("SELECT 'Earth' AS name, 6378 AS radius") >>> row = res.fetchone() >>> row.keys() ['name', 'radius'] >>> row[0], row["name"] # Access by index and name. ('Earth', 'Earth') >>> row["RADIUS"] # Column names are case-insensitive. 6378
-
Объекты PrepareProtocol¶
-
class
sqlite3.
PrepareProtocol
¶ Единственное назначение типа PrepareProtocol - действовать как протокол адаптации в стиле PEP 246 для объектов, которые могут adapt themselves в native SQLite types.
Исключения¶
Иерархия исключений определена DB-API 2.0 (PEP 249).
-
exception
sqlite3.
Warning
¶ Это исключение вызывается
sqlite3
, если SQL-запрос не являетсяstring
, или если вexecute()
илиexecutemany()
передано несколько операторов.Warning
является подклассомException
.
-
exception
sqlite3.
Error
¶ Базовый класс других исключений в этом модуле. Используйте его для перехвата всех ошибок одним единственным оператором
except
.Error
является подклассомException
.
-
exception
sqlite3.
InterfaceError
¶ Это исключение вызывается
sqlite3
при выборке через откат, или еслиsqlite3
не может связать параметры.InterfaceError
является подклассомError
.
-
exception
sqlite3.
DatabaseError
¶ Исключение, возникающее при ошибках, связанных с базой данных. Оно служит базовым исключением для нескольких типов ошибок базы данных. Оно вызывается неявно только через специализированные подклассы.
DatabaseError
является подклассомError
.
-
exception
sqlite3.
DataError
¶ Исключение, создаваемое для ошибок, вызванных проблемами с обрабатываемыми данными, например, числовые значения вне диапазона или слишком длинные строки.
DataError
является подклассомDatabaseError
.
-
exception
sqlite3.
OperationalError
¶ Исключение, возникающее при ошибках, которые связаны с работой базы данных и не обязательно находятся под контролем программиста. Например, путь к базе данных не найден, или транзакция не может быть обработана.
OperationalError
является подклассомDatabaseError
.
-
exception
sqlite3.
IntegrityError
¶ Исключение, возникающее при нарушении реляционной целостности базы данных, например, при неудачной проверке внешнего ключа. Является подклассом
DatabaseError
.
-
exception
sqlite3.
InternalError
¶ Исключение, возникающее, когда SQLite сталкивается с внутренней ошибкой. Если оно возникает, это может указывать на проблему с исполняемой библиотекой SQLite.
InternalError
является подклассомDatabaseError
.
-
exception
sqlite3.
ProgrammingError
¶ Исключение, возникающее при ошибках программирования API
sqlite3
, например, при попытке выполнить операцию над закрытымConnection
или при попытке выполнить не-DML операторы сexecutemany()
.ProgrammingError
является подклассомDatabaseError
.
-
exception
sqlite3.
NotSupportedError
¶ Исключение, возникающее в случае, если метод или API базы данных не поддерживается базовой библиотекой SQLite. Например, установка deterministic в
True
вcreate_function()
, если базовая библиотека SQLite не поддерживает детерминированные функции.NotSupportedError
является подклассомDatabaseError
.
Типы SQLite и Python¶
SQLite изначально поддерживает следующие типы: NULL
, INTEGER
, REAL
, TEXT
, BLOB
.
Таким образом, следующие типы Python могут быть переданы в SQLite без каких-либо проблем:
Тип Python |
Тип SQLite |
---|---|
|
|
|
|
|
|
|
|
|
Так типы SQLite преобразуются в типы Python по умолчанию:
Тип SQLite |
Тип Python |
---|---|
|
|
|
|
|
|
|
зависит от |
|
Система типов модуля sqlite3
расширяема двумя способами: вы можете хранить дополнительные типы Python в базе данных SQLite через object adapters, и вы можете позволить модулю sqlite3
конвертировать типы SQLite в типы Python через converters.
Руководства по эксплуатации¶
Использование заполнителей для привязки значений в SQL-запросах¶
Операции SQL обычно должны использовать значения из переменных Python. Однако остерегайтесь использовать строковые операции Python для сборки запросов, поскольку они уязвимы к SQL injection attacks (см. xkcd webcomic для юмористического примера того, что может пойти не так):
# Never do this -- insecure!
symbol = 'RHAT'
cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
Вместо этого используйте подстановку параметров DB-API. Чтобы вставить переменную в строку запроса, используйте в ней заполнитель, а фактические значения подставьте в запрос, предоставив их в виде tuple
значений второму аргументу метода курсора execute()
. В SQL-запросе может использоваться один из двух видов заполнителей: вопросительные знаки (стиль qmark) или именованные заполнители (стиль named). Для стиля qmark, parameters
должен быть sequence. Для именованного стиля это может быть либо экземпляр sequence, либо dict
. Длина sequence должна соответствовать количеству заполнителей, иначе возникает ошибка ProgrammingError
. Если задан dict
, он должен содержать ключи для всех именованных параметров. Любые лишние элементы игнорируются. Вот пример обоих стилей:
import sqlite3
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table lang (name, first_appeared)")
# This is the qmark style:
cur.execute("insert into lang values (?, ?)", ("C", 1972))
# The qmark style used with executemany():
lang_list = [
("Fortran", 1957),
("Python", 1991),
("Go", 2009),
]
cur.executemany("insert into lang values (?, ?)", lang_list)
# And this is the named style:
cur.execute("select * from lang where first_appeared=:year", {"year": 1972})
print(cur.fetchall())
con.close()
Использование адаптеров для хранения пользовательских типов Python в базах данных SQLite¶
SQLite поддерживает только ограниченный набор типов данных. Чтобы хранить пользовательские типы Python в базах данных SQLite, приспособите их к одному из Python types SQLite natively understands.
Существует два способа адаптации объектов Python к типам SQLite: позволить объекту адаптироваться самому или использовать адаптер callable. Последний вариант будет иметь приоритет над первым. Для библиотеки, экспортирующей пользовательский тип, может иметь смысл позволить этому типу адаптироваться самостоятельно. Разработчику приложения, возможно, имеет смысл взять управление в свои руки, зарегистрировав пользовательские функции адаптера.
Позволить вашему объекту адаптироваться самому¶
Предположим, у нас есть класс Point
, который представляет пару координат x
и y
в декартовой системе координат. Пара координат будет храниться в базе данных в виде текстовой строки с использованием точки с запятой для разделения координат. Это можно реализовать, добавив метод __conform__(self, protocol)
, который возвращает адаптированное значение. Объект, передаваемый в protocol, будет иметь тип PrepareProtocol
.
import sqlite3
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __conform__(self, protocol):
if protocol is sqlite3.PrepareProtocol:
return "%f;%f" % (self.x, self.y)
con = sqlite3.connect(":memory:")
cur = con.cursor()
p = Point(4.0, -3.2)
cur.execute("select ?", (p,))
print(cur.fetchone()[0])
con.close()
Регистрация вызываемого адаптера¶
Другая возможность - создать функцию, которая преобразует объект Python в SQLite-совместимый тип. Затем эту функцию можно зарегистрировать с помощью register_adapter()
.
import sqlite3
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def adapt_point(point):
return "%f;%f" % (point.x, point.y)
sqlite3.register_adapter(Point, adapt_point)
con = sqlite3.connect(":memory:")
cur = con.cursor()
p = Point(4.0, -3.2)
cur.execute("select ?", (p,))
print(cur.fetchone()[0])
con.close()
Преобразование значений SQLite в пользовательские типы Python¶
Написание адаптера позволяет конвертировать из пользовательских типов Python в значения SQLite. Чтобы иметь возможность конвертировать из значений SQLite в пользовательские типы Python, мы используем конвертеры.
Давайте вернемся к классу Point
. Мы сохранили координаты x и y, разделенные точкой с запятой, в виде строк в SQLite.
Сначала мы определим функцию конвертера, которая принимает строку в качестве параметра и конструирует из нее объект Point
.
Примечание
Функции конвертера всегда передается объект bytes
, независимо от базового типа данных SQLite.
def convert_point(s):
x, y = map(float, s.split(b";"))
return Point(x, y)
Теперь нам нужно указать sqlite3
, когда он должен преобразовать заданное значение SQLite. Это делается при подключении к базе данных с помощью параметра detect_types в connect()
. Есть три варианта:
Неявно: установить detect_types в
PARSE_DECLTYPES
.Явное: установить detect_types в
PARSE_COLNAMES
Оба: установите detect_types в
sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES
. Имена столбцов имеют приоритет над объявленными типами.
Следующий пример иллюстрирует неявный и явный подходы:
import sqlite3
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __repr__(self):
return f"Point({self.x}, {self.y})"
def adapt_point(point):
return f"{point.x};{point.y}".encode("utf-8")
def convert_point(s):
x, y = list(map(float, s.split(b";")))
return Point(x, y)
# Register the adapter and converter
sqlite3.register_adapter(Point, adapt_point)
sqlite3.register_converter("point", convert_point)
# 1) Parse using declared types
p = Point(4.0, -3.2)
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.execute("create table test(p point)")
cur.execute("insert into test(p) values (?)", (p,))
cur.execute("select p from test")
print("with declared types:", cur.fetchone()[0])
cur.close()
con.close()
# 2) Parse using column names
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
cur = con.execute("create table test(p)")
cur.execute("insert into test(p) values (?)", (p,))
cur.execute('select p as "p [point]" from test')
print("with column names:", cur.fetchone()[0])
cur.close()
con.close()
Адаптеры и конвертеры по умолчанию¶
В модуле datetime имеются адаптеры по умолчанию для типов date и datetime. Они будут передаваться в SQLite как даты/временные метки ISO.
Конвертеры по умолчанию зарегистрированы под именем «date» для datetime.date
и под именем «timestamp» для datetime.datetime
.
Таким образом, в большинстве случаев вы можете использовать метки даты/времени из Python без каких-либо дополнительных действий. Формат адаптеров также совместим с экспериментальными функциями даты/времени SQLite.
Следующий пример демонстрирует это.
import sqlite3
import datetime
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur = con.cursor()
cur.execute("create table test(d date, ts timestamp)")
today = datetime.date.today()
now = datetime.datetime.now()
cur.execute("insert into test(d, ts) values (?, ?)", (today, now))
cur.execute("select d, ts from test")
row = cur.fetchone()
print(today, "=>", row[0], type(row[0]))
print(now, "=>", row[1], type(row[1]))
cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"')
row = cur.fetchone()
print("current_date", row[0], type(row[0]))
print("current_timestamp", row[1], type(row[1]))
con.close()
Если временная метка, хранящаяся в SQLite, имеет дробную часть длиннее 6 чисел, ее значение будет усечено до микросекундной точности конвертером временных меток.
Примечание
Конвертер «timestamp» по умолчанию игнорирует смещения UTC в базе данных и всегда возвращает наивный объект datetime.datetime
. Чтобы сохранить смещения UTC в метках времени, либо оставьте конвертеры отключенными, либо зарегистрируйте конвертер с поддержкой смещений с помощью register_converter()
.
Рецепты адаптеров и преобразователей¶
В этом разделе приведены рецепты для распространенных адаптеров и конвертеров.
import datetime
import sqlite3
def adapt_date_iso(val):
"""Adapt datetime.date to ISO 8601 date."""
return val.isoformat()
def adapt_datetime_iso(val):
"""Adapt datetime.datetime to timezone-naive ISO 8601 date."""
return val.isoformat()
def adapt_datetime_epoch(val)
"""Adapt datetime.datetime to Unix timestamp."""
return int(val.timestamp())
sqlite3.register_adapter(datetime.date, adapt_date_iso)
sqlite3.register_adapter(datetime.datetime, adapt_datetime_iso)
sqlite3.register_adapter(datetime.datetime, adapt_datetime_epoch)
def convert_date(val):
"""Convert ISO 8601 date to datetime.date object."""
return datetime.date.fromisoformat(val)
def convert_datetime(val):
"""Convert ISO 8601 datetime to datetime.datetime object."""
return datetime.datetime.fromisoformat(val)
def convert_timestamp(val):
"""Convert Unix epoch timestamp to datetime.datetime object."""
return datetime.datetime.fromtimestamp(val)
sqlite3.register_converter("date", convert_date)
sqlite3.register_converter("datetime", convert_datetime)
sqlite3.register_converter("timestamp", convert_timestamp)
Использование методов быстрого подключения¶
Используя методы execute()
, executemany()
и executescript()
класса Connection
, ваш код может быть написан более лаконично, поскольку вам не нужно явно создавать (часто излишние) объекты Cursor
. Вместо этого объекты Cursor
создаются неявно, а эти методы быстрого доступа возвращают объекты курсора. Таким образом, вы можете выполнить оператор SELECT
и выполнить итерацию по нему, используя только один вызов объекта Connection
.
import sqlite3
langs = [
("C++", 1985),
("Objective-C", 1984),
]
con = sqlite3.connect(":memory:")
# Create the table
con.execute("create table lang(name, first_appeared)")
# Fill the table
con.executemany("insert into lang(name, first_appeared) values (?, ?)", langs)
# Print the table contents
for row in con.execute("select name, first_appeared from lang"):
print(row)
print("I just deleted", con.execute("delete from lang").rowcount, "rows")
# close is not a shortcut method and it's not called automatically,
# so the connection object should be closed manually
con.close()
Использование соединения в качестве менеджера контекста¶
Объект Connection
можно использовать в качестве контекстного менеджера, который автоматически фиксирует или откатывает открытые транзакции при выходе из тела контекстного менеджера. Если тело оператора with
завершается без исключений, транзакция фиксируется. Если фиксация не удается, или если тело оператора with
вызывает не пойманное исключение, транзакция откатывается.
Если при выходе из тела оператора with
не существует открытой транзакции, то менеджер контекста не работает.
Примечание
Контекстный менеджер неявно не открывает новую транзакцию и не закрывает соединение.
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("create table lang (id integer primary key, name varchar unique)")
# Successful, con.commit() is called automatically afterwards
with con:
con.execute("insert into lang(name) values (?)", ("Python",))
# con.rollback() is called after the with block finishes with an exception, the
# exception is still raised and must be caught
try:
with con:
con.execute("insert into lang(name) values (?)", ("Python",))
except sqlite3.IntegrityError:
print("couldn't add Python twice")
# Connection object used as context manager only commits or rollbacks transactions,
# so the connection object should be closed manually
con.close()
Работа с URIs SQLite¶
Некоторые полезные трюки с URI включают:
Открыть базу данных в режиме только для чтения:
con = sqlite3.connect("file:template.db?mode=ro", uri=True)
Не создавайте неявно новый файл базы данных, если он еще не существует; при невозможности создать новый файл будет выдаваться сообщение
OperationalError
:con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True)
Создайте общую именованную базу данных in-memory:
con1 = sqlite3.connect("file:mem1?mode=memory&cache=shared", uri=True) con2 = sqlite3.connect("file:mem1?mode=memory&cache=shared", uri=True) con1.execute("create table t(t)") con1.execute("insert into t values(28)") con1.commit() rows = con2.execute("select * from t").fetchall()
Более подробную информацию об этой функции, включая список параметров, можно найти в SQLite URI documentation.
Пояснение¶
Контроль транзакций¶
Модуль sqlite3
не придерживается обработки транзакций, рекомендованной PEP 249.
Если атрибут соединения isolation_level
не является None
, новые транзакции неявно открываются перед execute()
и executemany()
выполнением операторов INSERT
, UPDATE
, DELETE
или REPLACE
. Используйте методы commit()
и rollback()
для фиксации и отката отложенных транзакций. Вы можете выбрать базовый SQLite transaction behaviour - то есть, выполняются ли неявно операторы BEGIN
и какого типа sqlite3
- с помощью атрибута isolation_level
.
Если isolation_level
установлено значение None
, то транзакции неявно не открываются вообще. Это оставляет базовую библиотеку SQLite в режиме autocommit mode, но также позволяет пользователю выполнять собственную обработку транзакций с помощью явных операторов SQL. Режим автокоммита базовой библиотеки SQLite можно запросить с помощью атрибута in_transaction
.
Метод executescript()
неявно фиксирует любую ожидающую транзакцию перед выполнением данного SQL-сценария, независимо от значения isolation_level
.
Изменено в версии 3.6: sqlite3
раньше неявно фиксировал открытую транзакцию перед DDL-операторами. Теперь это не так.