Некоторые символы, такие как '|'
или '('
, являются специальными. Специальные символы либо обозначают классы обычных символов, либо влияют на интерпретацию регулярных выражений вокруг них.¶
Kod źródłowy:. Lib/sqlite3/
SQLite — це бібліотека C, яка надає легку дискову базу даних, яка не потребує окремого серверного процесу та дозволяє отримувати доступ до бази даних за допомогою нестандартного варіанту мови запитів SQL. Деякі програми можуть використовувати SQLite для внутрішнього зберігання даних. Також можна створити прототип програми за допомогою SQLite, а потім перенести код у більшу базу даних, таку як PostgreSQL або Oracle.
Модуль sqlite3
был написан Герхардом Херингом. Он предоставляет интерфейс SQL, соответствующий спецификации DB-API 2.0, описанной PEP 249, и требует SQLite 3.15.2 или новее.
Цей документ включає в себе 4 головні розділи:
sqlite3-tutorial`вчить як використовувати :mod:!sqlite3` модуль.
Referensi описує класи і функції, які визначає цей модуль
Практические руководства деталі як вирішувати певні задачі.
Wytłumaczenie надає поглиблений контекст контролю транзакцій.
Zobacz także
- https://www.sqlite.org
Halaman web SQLite; dokumentasi menjelaskan sintaks dan tipe data yang tersedia untuk dialek SQL yang didukung.
- https://www.w3schools.com/sql/
Tutorial, referensi, dan contoh untuk mempelajari sintaks SQL.
- PEP 249 - Spesifikasi API Basisdata 2.0
PEP ditulis oleh Marc-André Lemburg.
Tutorial¶
На цьому курсі Ви створите базу данних фільмів Монті Пайтон використовуючи базовий функціонал 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()
Теперь, когда у нас есть соединение с базой данных и курсор, мы можем создать таблицу базы данных «фильм» со столбцами для названия, года выпуска и оценки по отзывам. Для простоты мы можем просто использовать имена столбцов в объявлении таблицы — благодаря функции «гибкой типизации» SQLite указание типов данных не является обязательным. Выполните оператор CREATE TABLE, вызвав cur.execute(...)
:
cur.execute("CREATE TABLE movie(title, year, score)")
Мы можем убедиться, что новая таблица создана, запросив встроенную в SQLite таблицу sqlite_master, которая теперь должна содержать запись для определения таблицы Movie (подробности см. в разделе «Таблица схемы»). ). Выполните этот запрос, вызвав cur.execute(...)
, присвойте результат res
и вызовите :meth:`res.fetchone() <Cursor.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
, и вызовите :meth:`res.fetchall() <Cursor.fetchall> ` чтобы вернуть все полученные строки:
>>> res = cur.execute("SELECT score FROM movie")
>>> res.fetchall()
[(8.2,), (7.5,)]
Результатом является list
из двух tuple
s, по одному на строку, каждый из которых содержит значение 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.
Обратите внимание, что заполнители ?
используются для привязки данных
к запросу. Всегда используйте заполнители вместо string formatting для привязки значений Python к операторам SQL, чтобы избежать атак SQL-инъекцией (более подробную информацию см. в Как использовать заполнители для привязки значений в запросах SQL).
Мы можем убедиться, что новые строки были вставлены, выполнив запрос SELECT, на этот раз перебирая результаты запроса:
>>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):
... print(row)
(1971, 'And Now for Something Completely Different')
(1975, 'Monty Python and the Holy Grail')
(1979, "Monty Python's Life of Brian")
(1982, 'Monty Python Live at the Hollywood Bowl')
(1983, "Monty Python's The Meaning of Life")
Каждая строка представляет собой кортеж из двух элементов типа «(год, заголовок)», соответствующий столбцам, выбранным в запросе.
Наконец, убедитесь, что база данных записана на диск, вызвав 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
>>> new_con.close()
Теперь вы создали базу данных SQLite, используя модуль sqlite3
, вставили в нее данные и получили из нее значения несколькими способами.
Zobacz także
Практические руководства для дальнейшего чтения:
Wytłumaczenie для более подробной информации по управлению транзакциями.
Referensi¶
Функции модуля¶
- sqlite3.connect(database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=128, uri=False, *, autocommit=sqlite3.LEGACY_TRANSACTION_CONTROL)¶
Откройте соединение с базой данных SQLite.
- Parametry:
database (path-like object) – Путь к файлу базы данных, который нужно открыть. Вы можете передать
":memory:"
, чтобы создать ``базу данных SQLite, существующую только в памяти <https://sqlite.org/inmemorydb.html>`_, и открыть к ней соединение.timeout (float) – Сколько секунд соединение должно ждать, прежде чем вызвать
OperationalError
, когда таблица заблокирована. Если другое соединение открывает транзакцию для изменения таблицы, эта таблица будет заблокирована до тех пор, пока транзакция не будет зафиксирована. По умолчанию пять секунд.detect_types (int) – Контролируйте, будут ли типы данных, не изначально поддерживаемые SQLite, искаться для преобразования в типы Python, используя конвертеры, зарегистрированные с помощью
register_converter()
. Установите его в любую комбинацию (используя|
, побитовое ИЛИ)PARSE_DECLTYPES
иPARSE_COLNAMES
, чтобы включить это. Имена столбцов имеют приоритет над объявленными типами, если установлены оба флага. По умолчанию (0
) определение типа отключено.isolation_level (str | None) – Управляйте поведением обработки устаревших транзакций. См.
Connection.isolation_level
и Контроль транзакций через атрибутisolation_level. для получения дополнительной информации. Может быть"ОТЛОЖЕНО"
(по умолчанию),"ЭКСКЛЮЗИВНО"
или"НЕМЕДЛЕННО"
; илиNone
, чтобы неявно запретить открытие транзакций. Не имеет никакого эффекта, если дляConnection.autocommit
не установлено значениеLEGACY_TRANSACTION_CONTROL
(по умолчанию).check_same_thread (bool) – Если
True
(по умолчанию),ProgrammingError
будет вызвано, если соединение с базой данных используется потоком, отличным от того, который его создал. ЕслиFalse
, доступ к соединению может осуществляться в нескольких потоках; Операции записи могут потребоваться сериализовать пользователю, чтобы избежать повреждения данных. См.threadsafety
для получения дополнительной информации.factory (Connection) – Пользовательский подкласс
Connection
для создания соединения с классомConnection
(если не с классом по умолчанию).cached_statements (int) – Число операторов, которые
sqlite3
должен внутренне кэшировать для этого соединения, чтобы избежать накладных расходов на анализ. По умолчанию 128 операторов.uri (bool) – Если установлено значение True, database интерпретируется как URI с путем к файлу и дополнительной строкой запроса. Часть схемы должна быть
"file:"
, а путь может быть относительным или абсолютным. Строка запроса позволяет передавать параметры в SQLite, используя различные трюки sqlite3-uri.autocommit (bool) – Управляйте PEP 249 поведением обработки транзакций. См.
Connection.autocommit
и Управление транзакциями через атрибут autocommit. для получения дополнительной информации. autocommit в настоящее время по умолчанию имеет значениеLEGACY_TRANSACTION_CONTROL
. В будущем выпуске Python значение по умолчанию изменится на «False».
- Typ zwracany:
Викликає подію аудиту
sqlite3.connect
з аргументомбаза даних
.Викликає подію аудиту
sqlite3.connect/handle
з аргументомconnection_handle
.Zmienione w wersji 3.4: Menambahkan parameter uri.
Zmienione w wersji 3.7: database тепер також може бути path-like object, а не лише рядком.
Zmienione w wersji 3.10: Додано подію аудиту
sqlite3.connect/handle
.Zmienione w wersji 3.12: Добавлен параметр autocommit.
Zmienione w wersji 3.13: Позиционное использование параметров timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements и uri устарело. В Python 3.15 они станут параметрами только для ключевых слов.
- sqlite3.complete_statement(statement)¶
Возвращайте
True
, если строка оператор содержит один или несколько полных операторов SQL. Никакая синтаксическая проверка или синтаксический анализ не выполняется, кроме проверки отсутствия незамкнутых строковых литералов и завершения оператора точкой с запятой.Na przykład:
>>> sqlite3.complete_statement("SELECT foo FROM bar;") True >>> sqlite3.complete_statement("SELECT foo") False
Эта функция может быть полезна во время ввода командной строки, чтобы определить, образует ли введенный текст полный оператор SQL, или требуется ли дополнительный ввод перед вызовом
execute()
.См.
runsource()
в Lib/sqlite3/__main__.py для использования в реальных условиях.
- sqlite3.enable_callback_tracebacks(flag, /)¶
Включите или отключите обратные трассировки обратного вызова. По умолчанию вы не будете получать никаких обратных трассировок в пользовательских функциях, агрегатах, конвертерах, обратных вызовах авторизатора и т. д. Если вы хотите их отладить, вы можете вызвать эту функцию с flag, установленным в
True
. После этого вы получите обратные трассировки от обратных вызовов вsys.stderr
. Используйте «False», чтобы снова отключить эту функцию.Informacja
Ошибки в обратных вызовах пользовательских функций регистрируются как невызываемые исключения. Используйте
unraisable обработчик перехвата
для самоанализа неудачного обратного вызова.
- sqlite3.register_adapter(type, adapter, /)¶
Зарегистрируйте адаптер callable, чтобы адаптировать тип type Python к типу SQLite. Адаптер вызывается с объектом Python типа type в качестве единственного аргумента и должен возвращать значение типа , который SQLite изначально понимает,.
- sqlite3.register_converter(typename, converter, /)¶
Зарегистрируйте converter callable для преобразования объектов SQLite типа typename в объект Python определенного типа. Конвертер вызывается для всех значений SQLite типа typename; ему передается объект
bytes
, и он должен возвращать объект желаемого типа Python. Обратитесь к параметру detect_types функцииconnect()
для получения информации о том, как работает определение типа.Примечание. typename и имя типа в вашем запросе сопоставляются без учета регистра.
Константы модуля¶
- sqlite3.LEGACY_TRANSACTION_CONTROL¶
Установите для
autocommit
эту константу, чтобы выбрать поведение управления транзакциями в старом стиле (до Python 3.12). Дополнительную информацию см. в разделе sqlite3-transaction-control-isolation-level.
- 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
с помощью оператора|
(побитовое или).Informacja
生成的字段 (例如
MAX(p)
) 将作为str
返回。 使用PARSE_COLNAMES
为这样的查询设置类型。
- sqlite3.PARSE_COLNAMES¶
Передайте это значение флага параметру detect_types
connect()
для поиска функции преобразователя, используя имя типа, проанализированное из имени столбца запроса, как ключ словаря преобразователя. Имя столбца запроса должно быть заключено в двойные кавычки ("
), а имя типа должно быть заключено в квадратные скобки ([]
).SELECT MAX(p) as "p [point]" FROM test; ! will look up converter "point"
Этот флаг можно комбинировать с
PARSE_DECLTYPES
с помощью оператора|
(побитовое или).
- sqlite3.SQLITE_OK¶
- sqlite3.SQLITE_DENY¶
- sqlite3.SQLITE_IGNORE¶
Флаги, которые должны быть возвращены authorizer_callback callable, переданным в
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"
.Informacja
Также поддерживается стиль параметров DB-API
named
.
- sqlite3.sqlite_version_info¶
Номер версии библиотеки времени выполнения SQLite в виде
tuple
изintegers
.
- sqlite3.threadsafety¶
Целочисленная константа, требуемая DB-API 2.0, указывающая уровень потокобезопасности, поддерживаемый модулем
sqlite3
. Этот атрибут устанавливается на основе поточного режима по умолчанию, с которым скомпилирована базовая библиотека SQLite. Режимы потоков SQLite:Однопоточный: в этом режиме все мьютексы отключены, и SQLite небезопасно использовать более чем в одном потоке одновременно.
Многопоточный: в этом режиме SQLite можно безопасно использовать в нескольких потоках при условии, что ни одно соединение с базой данных не используется одновременно в двух или более потоках.
Сериализация: в сериализованном режиме SQLite может безопасно использоваться несколькими потоками без ограничений.
Сопоставления режимов потоков SQLite с уровнями безопасности потоков DB-API 2.0 следующие:
Режим потоков SQLite
Значение DB-API 2.0
однопоточный
0
0
Потоки не могут совместно использовать модуль
многопоточный
1
2
Потоки могут совместно использовать модуль, но не соединения.
сериализованный
3
1
Потоки могут совместно использовать модуль, соединения и курсоры.
Zmienione w wersji 3.11: Устанавливайте threadsafety динамически, а не жестко запрограммируйте его на «1».
- sqlite3.version¶
Version number of this module as a
string
. This is not the version of the SQLite library.Deprecated since version 3.12, will be removed in version 3.14: This constant used to reflect the version number of the
pysqlite
package, a third-party library which used to upstream changes tosqlite3
. Today, it carries no meaning or practical value.
- sqlite3.version_info¶
Version number of this module as a
tuple
ofintegers
. This is not the version of the SQLite library.Deprecated since version 3.12, will be removed in version 3.14: This constant used to reflect the version number of the
pysqlite
package, a third-party library which used to upstream changes tosqlite3
. Today, it carries no meaning or practical value.
- sqlite3.SQLITE_DBCONFIG_DEFENSIVE¶
- sqlite3.SQLITE_DBCONFIG_DQS_DDL¶
- sqlite3.SQLITE_DBCONFIG_DQS_DML¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_FKEY¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_QPSG¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_TRIGGER¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_VIEW¶
- sqlite3.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE¶
- sqlite3.SQLITE_DBCONFIG_LEGACY_FILE_FORMAT¶
- sqlite3.SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE¶
- sqlite3.SQLITE_DBCONFIG_RESET_DATABASE¶
- sqlite3.SQLITE_DBCONFIG_TRIGGER_EQP¶
- sqlite3.SQLITE_DBCONFIG_TRUSTED_SCHEMA¶
- sqlite3.SQLITE_DBCONFIG_WRITABLE_SCHEMA¶
Эти константы используются для методов
Connection.setconfig()
иgetconfig()
.Доступность этих констант зависит от версии SQLite Python, с которой был скомпилирован.
Dodane w wersji 3.12.
Zobacz także
- https://www.sqlite.org/c3ref/c_dbconfig_defensive.html
Документация SQLite: Параметры конфигурации подключения к базе данных
Объекты подключения¶
- class sqlite3.Connection¶
Каждая открытая база данных SQLite представлена объектом Connection, который создается с помощью
sqlite3.connect()
. Их основная цель — создание объектовCursor
и Контроль транзакций.Zobacz także
Zmienione w wersji 3.13:
ResourceWarning
выдается, еслиclose()
не вызывается перед удалением объектаConnection
.Підключення до бази даних SQLite має такі атрибути та методи:
- cursor(factory=Cursor)¶
Создайте и верните объект
Cursor
. Метод курсора принимает один необязательный параметр factory. Если указано, это должен быть callable, возвращающий экземплярCursor
или его подклассов.
- blobopen(table, column, row, /, *, readonly=False, name='main')¶
Откройте дескриптор
Blob
для существующего BLOB.- Parametry:
table (str) – Имя таблицы, в которой находится большой двоичный объект.
column (str) – Имя столбца, в котором расположен большой двоичный объект.
row (str) – Имя строки, в которой находится большой двоичный объект.
readonly (bool) – Установите значение True, если большой двоичный объект должен быть открыт без разрешений на запись. По умолчанию установлено значение «False».
name (str) – Имя базы данных, в которой находится большой двоичный объект. По умолчанию
"main"
.
- Wyrzuca:
OperationalError – При попытке открыть большой двоичный объект в таблице БЕЗ ROWID.
- Typ zwracany:
Informacja
Размер большого двоичного объекта нельзя изменить с помощью класса
Blob
. Используйте функцию SQL «zeroblob», чтобы создать большой двоичный объект фиксированного размера.Dodane w wersji 3.11.
- commit()¶
Зафиксируйте любую ожидающую транзакцию в базе данных. Если
autocommit
имеет значениеTrue
или нет открытой транзакции, этот метод ничего не делает. Еслиautocommit
имеет значениеFalse
, новая транзакция неявно открывается, если ожидающая транзакция была зафиксирована этим методом.
- rollback()¶
Откат к началу любой ожидающей транзакции. Если
autocommit
имеет значениеTrue
или нет открытой транзакции, этот метод ничего не делает. Еслиautocommit
имеет значениеFalse
, новая транзакция неявно открывается, если ожидающая транзакция была откатана этим методом.
- close()¶
Закройте соединение с базой данных. Если
autocommit
имеет значениеFalse
, любая ожидающая транзакция неявно откатывается. Еслиautocommit
имеет значениеTrue
илиLEGACY_TRANSACTION_CONTROL
, неявный контроль транзакций не выполняется. Обязательно выполните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.
- Parametry:
name (str) – Имя функции SQL.
narg (int) – Количество аргументов, которые может принять функция SQL. Если
-1
, он может принимать любое количество аргументов.func (callback | None) – callable, который вызывается при вызове функции SQL. Вызываемый объект должен возвращать тип, изначально поддерживаемый SQLite. Установите значение «Нет», чтобы удалить существующую функцию SQL.
deterministic (bool) – Если
True
, созданная функция SQL помечается как ``детерминированная <https://sqlite.org/deterministic.html>`_, что позволяет SQLite выполнять дополнительную оптимизацию.
Zmienione w wersji 3.8: Добавлен параметр детерминированный.
Przykład:
>>> import hashlib >>> def md5sum(t): ... return hashlib.md5(t).hexdigest() >>> con = sqlite3.connect(":memory:") >>> con.create_function("md5", 1, md5sum) >>> for row in con.execute("SELECT md5(?)", (b"foo",)): ... print(row) ('acbd18db4cc2f85cedef654fccc4a4d8',) >>> con.close()
Zmienione w wersji 3.13: Передача name, narg и func в качестве аргументов ключевых слов не рекомендуется. В Python 3.15 эти параметры станут только позиционными.
- create_aggregate(name, n_arg, aggregate_class)¶
Создайте или удалите определяемую пользователем агрегатную функцию SQL.
- Parametry:
name (str) – Имя агрегатной функции SQL.
n_arg (int) – Число аргументов, которые может принять агрегатная функция SQL. Если
-1
, он может принимать любое количество аргументов.aggregate_class (class | None) – Класс должен реализовывать следующие методы: *
step()
: добавляет строку в агрегат. *finalize()
: Возвращает окончательный результат агрегата как тип, изначально поддерживаемый SQLite. Количество аргументов, которые должен принимать методstep()
, контролируется n_arg. Установите значение «Нет», чтобы удалить существующую агрегатную функцию SQL.
Przykład:
class MySum: def __init__(self): self.count = 0 def step(self, value): self.count += value def finalize(self): return self.count con = sqlite3.connect(":memory:") con.create_aggregate("mysum", 1, MySum) cur = con.execute("CREATE TABLE test(i)") cur.execute("INSERT INTO test(i) VALUES(1)") cur.execute("INSERT INTO test(i) VALUES(2)") cur.execute("SELECT mysum(i) FROM test") print(cur.fetchone()[0]) con.close()
Zmienione w wersji 3.13: Передача name, n_arg и aggregate_class в качестве аргументов ключевых слов устарела. В Python 3.15 эти параметры станут только позиционными.
- create_window_function(name, num_params, aggregate_class, /)¶
Создайте или удалите пользовательскую агрегатную оконную функцию.
- Parametry:
name (str) – Имя агрегатной оконной функции SQL, которую необходимо создать или удалить.
num_params (int) – Число аргументов, которые может принять агрегатная оконная функция SQL. Если
-1
, он может принимать любое количество аргументов.aggregate_class (class | None) – Класс, который должен реализовывать следующие методы: *
step()
: добавляет строку в текущее окно. *value()
: Возвращает текущее значение агрегата. *inverse()
: удалить строку из текущего окна. *finalize()
: Возвращает окончательный результат агрегата как тип, изначально поддерживаемый SQLite. Количество аргументов, которые должны принимать методыstep()
иvalue()
, контролируется num_params. Установите значение «Нет», чтобы удалить существующую агрегатную оконную функцию SQL.
- Wyrzuca:
NotSupportedError – При использовании с версией SQLite старше 3.25.0, которая не поддерживает агрегатные оконные функции.
Dodane w wersji 3.11.
Przykład:
# Example taken from https://www.sqlite.org/windowfunctions.html#udfwinfunc class WindowSumInt: def __init__(self): self.count = 0 def step(self, value): """Add a row to the current window.""" self.count += value def value(self): """Return the current value of the aggregate.""" return self.count def inverse(self, value): """Remove a row from the current window.""" self.count -= value def finalize(self): """Return the final value of the aggregate. Any clean-up actions should be placed here. """ return self.count con = sqlite3.connect(":memory:") cur = con.execute("CREATE TABLE test(x, y)") values = [ ("a", 4), ("b", 5), ("c", 3), ("d", 8), ("e", 1), ] cur.executemany("INSERT INTO test VALUES(?, ?)", values) con.create_window_function("sumint", 1, WindowSumInt) cur.execute(""" SELECT x, sumint(y) OVER ( ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS sum_y FROM test ORDER BY x """) print(cur.fetchall()) con.close()
- create_collation(name, callable, /)¶
Створіть зіставлення під назвою name за допомогою функції зіставлення callable. callable передається два аргументи
string
, і він має повернутиціле число
:1
, якщо перший впорядкований вище за другий-1
, якщо перший впорядкований нижче другого0
, якщо вони в порядку рівності
У наступному прикладі показано порівняння зворотного сортування:
def collate_reverse(string1, string2): if string1 == string2: return 0 elif string1 < string2: return 1 else: return -1 con = sqlite3.connect(":memory:") con.create_collation("reverse", collate_reverse) cur = con.execute("CREATE TABLE test(x)") cur.executemany("INSERT INTO test(x) VALUES(?)", [("a",), ("b",)]) cur.execute("SELECT x FROM test ORDER BY x COLLATE reverse") for row in cur: print(row) con.close()
Удалите функцию сопоставления, установив для callable значение «None».
Zmienione w wersji 3.11: Имя параметра сортировки может содержать любой символ Юникода. Раньше допускались только символы ASCII.
- interrupt()¶
Вызовите этот метод из другого потока, чтобы прервать любые запросы, которые могут выполняться в соединении. Прерванные запросы вызовут ошибку
OperationalError
.
- set_authorizer(authorizer_callback)¶
Зарегистрируйте callable authorizer_callback, чтобы он вызывался при каждой попытке доступа к столбцу таблицы в базе данных. Обратный вызов должен возвращать один из
SQLITE_OK
,SQLITE_DENY
илиSQLITE_IGNORE
, чтобы указать, как доступ к столбцу должен обрабатываться базовой библиотекой SQLite.Первый аргумент обратного вызова указывает, какая операция должна быть авторизована. Второй и третий аргументы будут аргументами или «Нет» в зависимости от первого аргумента. Четвертый аргумент — это имя базы данных («main», «temp» и т. д.), если применимо. Пятый аргумент — это имя самого внутреннего триггера или представления, которое отвечает за попытку доступа, или «Нет», если эта попытка доступа происходит непосредственно из входного кода SQL.
Пожалуйста, обратитесь к документации SQLite о возможных значениях первого аргумента и значении второго и третьего аргумента в зависимости от первого. Все необходимые константы доступны в модуле
sqlite3
.Передача None в качестве authorizer_callback отключит авторизатор.
Zmienione w wersji 3.11: Добавлена поддержка отключения авторизатора с помощью None.
Zmienione w wersji 3.13: Передача authorizer_callback в качестве аргумента ключевого слова устарела. В Python 3.15 параметр станет только позиционным.
- set_progress_handler(progress_handler, n)¶
Зарегистрируйте callable progress_handler, который будет вызываться для каждой n инструкции виртуальной машины SQLite. Это полезно, если вы хотите, чтобы вас вызывали из SQLite во время длительных операций, например для обновления графического интерфейса.
Если вы хотите очистить любой ранее установленный обработчик прогресса, вызовите метод с
None
для progress_handler.Возврат ненулевого значения из функции-обработчика завершит текущий запрос и вызовет исключение
DatabaseError
.Zmienione w wersji 3.13: Передача progress_handler в качестве аргумента ключевого слова устарела. В Python 3.15 параметр станет только позиционным.
- set_trace_callback(trace_callback)¶
Зарегистрируйте callable trace_callback, чтобы он вызывался для каждого оператора SQL, который фактически выполняется серверной частью SQLite.
Единственный аргумент, передаваемый обратному вызову, — это оператор (как
str
), который выполняется. Возвращаемое значение обратного вызова игнорируется. Обратите внимание, что серверная часть не только выполняет операторы, переданные методамCursor.execute()
. Другие источники включают в себя управление транзакциями модуляsqlite3
и выполнение триггеров, определенных в текущей базе данных.Передача None в качестве trace_callback отключит обратный вызов трассировки.
Informacja
Винятки, викликані зворотним викликом трасування, не поширюються. Як допомога при розробці та налагодженні використовуйте
enable_callback_tracebacks()
, щоб увімкнути друк трасування з винятків, викликаних у зворотному виклику трасування.Dodane w wersji 3.3.
Zmienione w wersji 3.13: Передача trace_callback в качестве аргумента ключевого слова устарела. В Python 3.15 параметр станет только позиционным.
- enable_load_extension(enabled, /)¶
Включите механизм SQLite для загрузки расширений SQLite из общих библиотек, если enabled имеет значение
True
; в противном случае запретите загрузку расширений SQLite. Расширения SQLite могут определять новые функции, агрегаты или совершенно новые реализации виртуальных таблиц. Одним из широко известных расширений является расширение полнотекстового поиска, поставляемое вместе с SQLite.Informacja
Модуль
sqlite3
по умолчанию не имеет поддержки загружаемых расширений, поскольку на некоторых платформах (особенно macOS) есть библиотеки SQLite, которые компилируются без этой функции. Чтобы получить поддержку загружаемых расширений, вы должны передать параметр--enable-loadable-sqlite-extensions
в configure.Викликає подію аудиту
sqlite3.enable_load_extension
з аргументамиconnection
,enabled
.Dodane w wersji 3.2.
Zmienione w wersji 3.10: Додано подію аудиту sqlite3.enable_load_extension.
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)
- load_extension(path, /, *, entrypoint=None)¶
Загрузите расширение SQLite из общей библиотеки. Включите загрузку расширения с помощью
enable_load_extension()
перед вызовом этого метода.- Parametry:
Викликає подію аудиту
sqlite3.load_extension
з аргументамиconnection
,path
.Dodane w wersji 3.2.
Zmienione w wersji 3.10: Додано подію аудиту
sqlite3.load_extension
.Zmienione w wersji 3.12: Добавлен параметр entrypoint.
- iterdump(*, filter=None)¶
Верните iterator, чтобы выгрузить базу данных в виде исходного кода SQL. Полезно при сохранении базы данных в памяти для последующего восстановления. Аналогично команде
.dump
в оболочке sqlite3.- Parametry:
filter (str | None) – Необязательный шаблон
LIKE
для объектов базы данных, которые нужно выгрузить, напримерprefix_%
. Если «Нет» (по умолчанию), все объекты базы данных будут включены.
Przykład:
# Convert file example.db to SQL dump file dump.sql con = sqlite3.connect('example.db') with open('dump.sql', 'w') as f: for line in con.iterdump(): f.write('%s\n' % line) con.close()
Zmienione w wersji 3.13: Додано параметр фільтр.
- backup(target, *, pages=-1, progress=None, name='main', sleep=0.250)¶
Создайте резервную копию базы данных SQLite.
Работает, даже если к базе данных обращаются другие клиенты или одновременно по тому же соединению.
- Parametry:
target (Connection) – Соединение с базой данных, в котором сохраняется резервная копия.
pages (int) – Количество страниц, копируемых за один раз. Если оно равно или меньше «0», вся база данных копируется за один шаг. По умолчанию
-1
.progress (callback | None) – Если установлено значение callable, он вызывается с тремя целочисленными аргументами для каждой итерации резервного копирования: статус последней итерации, оставшееся количество страниц, которые еще предстоит скопировать, и общее количество страниц. По умолчанию установлено значение «Нет».
name (str) – Имя базы данных для резервного копирования. Либо
"main"
(по умолчанию) для основной базы данных,"temp"
для временной базы данных, либо имя пользовательской базы данных, прикрепленное с помощью оператора SQLATTACH DATABASE
.sleep (float) – Количество секунд ожидания между последовательными попытками резервного копирования оставшихся страниц.
Пример 1: копирование существующей базы данных в другую:
def progress(status, remaining, total): print(f'Copied {total-remaining} of {total} pages...') src = sqlite3.connect('example.db') dst = sqlite3.connect('backup.db') with dst: src.backup(dst, pages=1, progress=progress) dst.close() src.close()
Пример 2: скопируйте существующую базу данных во временную копию:
src = sqlite3.connect('example.db') dst = sqlite3.connect(':memory:') src.backup(dst) dst.close() src.close()
Dodane w wersji 3.7.
- getlimit(category, /)¶
Получите ограничение времени выполнения соединения.
- Parametry:
category (int) – Категория ограничения SQLite для запроса.
- Typ zwracany:
- Wyrzuca:
ProgrammingError – Если категория не распознается базовой библиотекой SQLite.
Например, запросите максимальную длину оператора SQL для
Connection
con
(по умолчанию — 1000000000):>>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH) 1000000000
Dodane w wersji 3.11.
- setlimit(category, limit, /)¶
Установите ограничение времени выполнения соединения. Попытки увеличить предел выше его жесткой верхней границы молча обрезаются до жесткой верхней границы. Независимо от того, был ли изменен лимит, возвращается предыдущее значение лимита.
- Parametry:
category (int) – _ Категория ограничения SQLite, которую необходимо установить.
limit (int) – Значение нового лимита. Если отрицательно, то предел тока не изменяется.
- Typ zwracany:
- Wyrzuca:
ProgrammingError – Если категория не распознается базовой библиотекой SQLite.
Например, ограничьте количество подключенных баз данных до 1 для
Connection
con
(ограничение по умолчанию — 10):>>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1) 10 >>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED) 1
Dodane w wersji 3.11.
- getconfig(op, /)¶
Запросить логический параметр конфигурации соединения.
Dodane w wersji 3.12.
- setconfig(op, enable=True, /)¶
Установите логический параметр конфигурации соединения.
- Parametry:
Dodane w wersji 3.12.
- serialize(*, name='main')¶
Сериализуйте базу данных в объект
bytes
. Для обычного файла базы данных на диске сериализация представляет собой просто копию дискового файла. Для базы данных в памяти или «временной» базы данных сериализация представляет собой ту же последовательность байтов, которая была бы записана на диск, если бы эта база данных была скопирована на диск.Informacja
Этот метод доступен только в том случае, если базовая библиотека SQLite имеет API сериализации.
Dodane w wersji 3.11.
- deserialize(data, /, *, name='main')¶
Десериализовать
сериализованную
базу данных вConnection
. Этот метод приводит к отключению соединения с базой данных name и повторному открытию name как базы данных в памяти на основе сериализации, содержащейся в data.- Parametry:
- Wyrzuca:
OperationalError – Если соединение с базой данных в данный момент участвует в транзакции чтения или операции резервного копирования.
DatabaseError – Если data не содержит действующую базу данных SQLite.
OverflowError – Если
len(data)
больше, чем2**63 - 1
.
Informacja
Этот метод доступен только в том случае, если базовая библиотека SQLite имеет API десериализации.
Dodane w wersji 3.11.
- autocommit¶
Этот атрибут управляет поведением транзакций, совместимым с PEP 249.
autocommit
имеет три допустимых значения:False
: выберите поведение транзакции, совместимое с PEP 249, подразумевая, чтоsqlite3
гарантирует, что транзакция всегда открыта. Используйтеcommit()
иrollback()
для закрытия транзакций.Это рекомендуемое значение
autocommit
.True
: используйте ``режим автоматической фиксации`_ SQLite.commit()
иrollback()
не действуют в этом режиме.LEGACY_TRANSACTION_CONTROL
: Управление транзакциями до версии Python 3.12 (не PEP 249-совместимой). Дополнительную информацию см. вisolation_level
.В настоящее время это значение по умолчанию для
autocommit
.
Изменение
autocommit
наFalse
откроет новую транзакцию, а изменение его наTrue
зафиксирует любую ожидающую транзакцию.Дополнительную информацию см. в Управление транзакциями через атрибут autocommit..
Informacja
Атрибут
isolation_level
не имеет никакого эффекта, еслиautocommit
не имеет значенияLEGACY_TRANSACTION_CONTROL
.Dodane w wersji 3.12.
- in_transaction¶
Этот атрибут только для чтения соответствует низкоуровневому режиму автоматической фиксации SQLite.
True
, если транзакция активна (есть незафиксированные изменения),False
в противном случае.Dodane w wersji 3.2.
- isolation_level¶
Управляет устаревшим режимом обработки транзакций
sqlite3
. Если установлено значение None, транзакции никогда не открываются неявно. Если установлено одно из «ОТЛОЖЕННЫХ», «НЕМЕДЛЕННЫХ» или «ЭКСКЛЮЗИВНЫХ», соответствующих базовому «поведению транзакций SQLite», неявное управление транзакциями выполняется.Если это не переопределено параметром isolation_level функции
connect()
, по умолчанию используется""
, который является псевдонимом для"DEFERRED"
.Informacja
Использование
autocommit
для управления обработкой транзакций рекомендуется вместо использованияisolation_level
.isolation_level
не имеет никакого эффекта, если дляautocommit
не установлено значениеLEGACY_TRANSACTION_CONTROL
(по умолчанию).
- row_factory¶
Начальный
row_factory
для объектовCursor
, созданных из этого соединения. Присвоение этому атрибуту не влияет наrow_factory
существующих курсоров, принадлежащих этому соединению, а только на новые. По умолчанию имеет значение None, что означает, что каждая строка возвращается какtuple
.Дополнительную информацию см. в Как создавать и использовать фабрики строк.
- text_factory¶
callable, который принимает параметр
bytes
и возвращает его текстовое представление. Вызываемый объект вызывается для значений SQLite с типом данных TEXT. По умолчанию для этого атрибута установлено значениеstr
.Дополнительную информацию см. в Как обрабатывать текстовые кодировки, отличные от UTF-8.
- total_changes¶
Возвращает общее количество строк базы данных, которые были изменены, вставлены или удалены с момента открытия соединения с базой данных.
Курсорные объекты¶
Объект «Курсор» представляет собой «курсор базы данных», который используется для выполнения операторов SQL и управления контекстом операции выборки. Курсоры создаются с помощью
Connection.cursor()
или с помощью любого из методов ярлыков соединений.Объекты курсора — это итераторы, что означает, что если вы
execute()
запросSELECT
, вы можете просто перебирать курсор для получения результирующих строк:for row in cur.execute("SELECT t FROM data"): print(row)
- class sqlite3.Cursor¶
Екземпляр
Cursor
має такі атрибути та методи.- execute(sql, parameters=(), /)¶
Выполните один оператор SQL, при необходимости привязав значения Python с помощью placeholders.
- Parametry:
sql (str) – Один оператор SQL.
parameters (
dict
| sequence) – Значения Python для привязки к заполнителям в sql. Adict
, если используются именованные заполнители. A sequence, если используются безымянные заполнители. См. Как использовать заполнители для привязки значений в запросах SQL.
- Wyrzuca:
ProgrammingError – If sql contains more than one SQL statement.
Если
autocommit
равенLEGACY_TRANSACTION_CONTROL
,isolation_level
не равенNone
, sql — этоINSERT
,UPDATE` `, ``DELETE
илиREPLACE
и нет открытой транзакции, транзакция неявно открывается перед выполнением sql.Deprecated since version 3.12, will be removed in version 3.14:
DeprecationWarning
is emitted if named placeholders are used and parameters is a sequence instead of adict
. Starting with Python 3.14,ProgrammingError
will be raised instead.Используйте
executescript()
для выполнения нескольких операторов SQL.
- executemany(sql, parameters, /)¶
Для каждого элемента в parameters повторно выполните параметризованный DML оператор SQL sql.
Использует ту же неявную обработку транзакций, что и
execute()
.- Parametry:
sql (str) – Один оператор SQL DML.
parameters (iterable) – iterable параметров для привязки к заполнителям в sql. См. Как использовать заполнители для привязки значений в запросах SQL.
- Wyrzuca:
ProgrammingError – If sql contains more than one SQL statement, or is not a DML statement.
Przykład:
rows = [ ("row1",), ("row2",), ] # cur is an sqlite3.Cursor object cur.executemany("INSERT INTO data VALUES(?)", rows)
Informacja
Любые результирующие строки отбрасываются, включая операторы DML с предложениями RETURNING.
Deprecated since version 3.12, will be removed in version 3.14:
DeprecationWarning
is emitted if named placeholders are used and the items in parameters are sequences instead ofdict
s. Starting with Python 3.14,ProgrammingError
will be raised instead.
- executescript(sql_script, /)¶
Выполните инструкции SQL в sql_script. Если
autocommit
имеет значениеLEGACY_TRANSACTION_CONTROL
и имеется ожидающая транзакция, сначала выполняется неявный операторCOMMIT
. Никакого другого неявного контроля транзакций не выполняется; любой контроль транзакций должен быть добавлен в sql_script.sql_script должен быть
string
.Przykład:
# 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()¶
Если
row_factory
имеет значениеNone
, вернуть следующий набор результатов запроса строки какtuple
. В противном случае передайте его фабрике строк и верните результат. Верните None, если данных больше нет.
- fetchmany(size=cursor.arraysize)¶
Возвращает следующий набор строк результата запроса в виде
list
. Верните пустой список, если больше нет доступных строк.Количество строк, извлекаемых за один вызов, определяется параметром size. Если size не задано,
arraysize
определяет количество извлекаемых строк. Если доступно меньше строк size, возвращается столько строк, сколько доступно.Зауважте, що з параметром size пов’язані міркування щодо продуктивності. Для оптимальної продуктивності зазвичай найкраще використовувати атрибут arraysize. Якщо використовується параметр size, то найкраще, щоб він зберігав те саме значення від одного виклику
fetchmany()
до наступного.
- fetchall()¶
Возвращает все (оставшиеся) строки результата запроса в виде
list
. Верните пустой список, если нет доступных строк. Обратите внимание, что атрибутarraysize
может повлиять на производительность этой операции.
- close()¶
Закрийте курсор зараз (а не під час кожного виклику
__del__
).Курсор стане непридатним для використання з цього моменту; виняток
ProgrammingError
буде викликано, якщо будь-яка операція буде виконана з курсором.
- setinputsizes(sizes, /)¶
Требуется для DB-API. Ничего не делает в
sqlite3
.
- setoutputsize(size, column=None, /)¶
Требуется для DB-API. Ничего не делает в
sqlite3
.
- arraysize¶
Атрибут читання/запису, який контролює кількість рядків, які повертає
fetchmany()
. Значення за замовчуванням дорівнює 1, що означає, що за виклик буде отримано один рядок.
- connection¶
Атрибут только для чтения, который предоставляет базу данных SQLite
Connection
, принадлежащую курсору. ОбъектCursor
, созданный вызовомcon.cursor()
, будет иметь атрибутconnection
, который ссылается на con:>>> con = sqlite3.connect(":memory:") >>> cur = con.cursor() >>> cur.connection == con True >>> con.close()
- description¶
Атрибут только для чтения, который предоставляет имена столбцов последнего запроса. Чтобы оставаться совместимым с API БД Python, он возвращает 7-кортеж для каждого столбца, где последние шесть элементов каждого кортежа имеют значение «Нет».
Він також встановлений для операторів
SELECT
без будь-яких відповідних рядків.
- lastrowid¶
Атрибут только для чтения, который предоставляет идентификатор последней вставленной строки. Он обновляется только после успешных операторов INSERT или REPLACE с использованием метода
execute()
. Для других операторов послеexecutemany()
илиexecutescript()
, или если вставка не удалась, значениеlastrowid
остается неизменным. Начальное значение «lastrowid» — «Нет».Informacja
Вставки в таблиці
БЕЗ ROWID
не записуються.Zmienione w wersji 3.6: Додано підтримку оператора REPLACE.
- rowcount¶
Атрибут только для чтения, который предоставляет количество измененных строк для операторов INSERT, UPDATE, DELETE и REPLACE; для других операторов, включая запросы CTE, равно
-1
. Он обновляется методамиexecute()
иexecutemany()
только после завершения выполнения оператора. Это означает, что все результирующие строки должны быть извлечены для обновленияrowcount
.
- row_factory¶
Управляйте представлением строки, полученной из этого
Cursor
. ЕслиNone
, строка представлена какtuple
. Можно установить включенныйsqlite3.Row
; или callable, который принимает два аргумента: объектCursor
иtuple
значений строк, и возвращает пользовательский объект, представляющий строку SQLite.По умолчанию установлено то, что
Connection.row_factory
было установлено при созданииCursor
. Назначение этого атрибута не влияет наConnection.row_factory
родительского соединения.Дополнительную информацию см. в Как создавать и использовать фабрики строк.
Строковые объекты¶
- class sqlite3.Row¶
Экземпляр
Row
служит высокооптимизированнойrow_factory
для объектовConnection
. Он поддерживает итерацию, проверку на равенство, доступlen()
и mapping по имени столбца и индексу.Два объекта
Row
сравниваются равными, если они имеют одинаковые имена и значения столбцов.Дополнительную информацию см. в Как создавать и использовать фабрики строк.
- keys()¶
Верните список имен столбцов в виде
strings
. Сразу после запроса он становится первым членом каждого кортежа вCursor.description
.
Zmienione w wersji 3.5: Menambahkan dukungan dari pemotongan.
Объекты BLOB-объектов¶
- class sqlite3.Blob¶
Dodane w wersji 3.11.
Экземпляр
Blob
— это файлоподобный объект, который может читать и записывать данные в SQLite BLOB. Вызовитеlen(blob)
, чтобы получить размер (количество байтов) большого двоичного объекта. Используйте индексы и slices для прямого доступа к данным большого двоичного объекта.Используйте
Blob
в качестве контекстного менеджера, чтобы гарантировать, что дескриптор BLOB-объекта будет закрыт после использования.con = sqlite3.connect(":memory:") con.execute("CREATE TABLE test(blob_col blob)") con.execute("INSERT INTO test(blob_col) VALUES(zeroblob(13))") # Write to our blob, using two write operations: with con.blobopen("test", "blob_col", 1) as blob: blob.write(b"hello, ") blob.write(b"world.") # Modify the first and last bytes of our blob blob[0] = ord("H") blob[-1] = ord("!") # Read the contents of our blob with con.blobopen("test", "blob_col", 1) as blob: greeting = blob.read() print(greeting) # outputs "b'Hello, world!'" con.close()
- close()¶
Закройте blob.
С этого момента большой двоичный объект станет непригоден для использования. Исключение
Error
(или подкласса) будет вызвано при попытке какой-либо дальнейшей операции с большим двоичным объектом.
- read(length=-1, /)¶
Считайте длину байтов данных из большого двоичного объекта в текущей позиции смещения. Если достигнут конец большого двоичного объекта, будут возвращены данные до EOF. Если длина не указана или имеет отрицательное значение,
read()
будет читать до конца большого двоичного объекта.
- write(data, /)¶
Запишите данные в большой двоичный объект по текущему смещению. Эта функция не может изменить длину большого двоичного объекта. Запись за пределами BLOB-объекта вызовет
ValueError
.
- tell()¶
Верните текущую позицию доступа к большому двоичному объекту.
- seek(offset, origin=os.SEEK_SET, /)¶
Установите текущую позицию доступа к большому двоичному объекту как offset. Аргумент origin по умолчанию имеет значение
os.SEEK_SET
(абсолютное позиционирование больших двоичных объектов). Другими значениями origin являютсяos.SEEK_CUR
(поиск относительно текущей позиции) иos.SEEK_END
(поиск относительно конца большого двоичного объекта).
Объекты подготовки протокола¶
- class sqlite3.PrepareProtocol¶
Единственная цель типа ПодготовкаПротокол — действовать как протокол адаптации стиля PEP 246 для объектов, которые могут адаптироваться к родным типам SQLite.
Wyjątki¶
Ієрархія винятків визначається DB-API 2.0 (PEP 249).
- exception sqlite3.Warning¶
Это исключение в настоящее время не вызывается модулем
sqlite3
, но может быть вызвано приложениями, использующимиsqlite3
, например, если определяемая пользователем функция усекает данные при вставке.Warning
является подклассомException
.
- exception sqlite3.Error¶
Базовий клас інших винятків у цьому модулі. Використовуйте це, щоб перехопити всі помилки за допомогою одного оператора
except
.Error
є підкласомException
.Если исключение возникло из библиотеки SQLite, к исключению добавляются следующие два атрибута:
- sqlite_errorcode¶
Числовой код ошибки из SQLite API
Dodane w wersji 3.11.
- sqlite_errorname¶
Символическое имя числового кода ошибки из SQLite API
Dodane w wersji 3.11.
- exception sqlite3.InterfaceError¶
Исключение возникло из-за неправильного использования низкоуровневого API SQLite C. Другими словами, если это исключение возникает, это, вероятно, указывает на ошибку в модуле
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
, например, предоставления неправильного количества привязок к запросу или попытки работы с закрытымСоединением
.ProgrammingError
является подклассомDatabaseError
.
- exception sqlite3.NotSupportedError¶
Исключение возникает в случае, если метод или API базы данных не поддерживается базовой библиотекой SQLite. Например, установите для параметра deterministic значение True в
create_function()
, если базовая библиотека SQLite не поддерживает детерминированные функции.NotSupportedError
является подклассомDatabaseError
.
SQLite dan tipe Python¶
SQLite спочатку підтримує такі типи: NULL
, INTEGER
, REAL
, TEXT
, BLOB
.
Таким чином, такі типи Python можна без будь-яких проблем надсилати до SQLite:
Python type |
tipe SQLite |
---|---|
|
|
|
|
|
|
|
|
|
Ось як типи SQLite перетворюються на типи Python за замовчуванням:
tipe SQLite |
Python type |
---|---|
|
|
|
|
|
|
|
залежить від |
|
Система типов модуля sqlite3
расширяется двумя способами: вы можете хранить дополнительные типы Python в базе данных SQLite через object адаптеры, и вы можете позволить :mod Модуль :!sqlite3 преобразует типы SQLite в типы Python с помощью converters.
Адаптеры и конвертеры по умолчанию (устарело)¶
Informacja
Адаптеры и конвертеры по умолчанию устарели, начиная с Python 3.12. Вместо этого используйте sqlite3-adapter-converter-recipes и адаптируйте их к своим потребностям.
Устаревшие адаптеры и преобразователи по умолчанию состоят из:
Адаптер для объектов
datetime.date
кstrings
в формате ISO 8601.Адаптер для объектов
datetime.datetime
к строкам в формате ISO 8601.Конвертер для объявленных <sqlite3-converters>` типов даты в объекты
datetime.date
.Конвертер объявленных типов «меток времени» в объекты
datetime.datetime
. Дробные части будут усечены до 6 цифр (с точностью до микросекунды).
Informacja
Конвертер „міток часу” за замовчуванням ігнорує зміщення UTC у базі даних і завжди повертає простий об’єкт datetime.datetime
. Щоб зберегти зміщення UTC у мітках часу, залиште конвертери вимкненими або зареєструйте конвертер із зсувом за допомогою register_converter()
.
Niezalecane od wersji 3.12.
Интерфейс командной строки¶
Модуль sqlite3
можно вызвать как скрипт, используя переключатель интерпретатора -m
, чтобы обеспечить простую оболочку SQLite. Сигнатура аргумента следующая:
python -m sqlite3 [-h] [-v] [filename] [sql]
Введите .quit
или CTRL-D, чтобы выйти из оболочки.
- -h, --help¶
Распечатать справку CLI.
- -v, --version¶
Распечатайте базовую версию библиотеки SQLite.
Dodane w wersji 3.12.
Практические руководства¶
Как использовать заполнители для привязки значений в запросах SQL¶
В операциях SQL обычно необходимо использовать значения переменных Python. Однако остерегайтесь использования строковых операций Python для сборки запросов, поскольку они уязвимы для атак с использованием SQL-инъекций. Например, злоумышленник может просто закрыть одинарную кавычку и ввести OR TRUE
, чтобы выбрать все строки:
>>> # Never do this -- insecure!
>>> symbol = input()
' OR TRUE; --
>>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol
>>> print(sql)
SELECT * FROM stocks WHERE symbol = '' OR TRUE; --'
>>> cur.execute(sql)
Вместо этого используйте подстановку параметров DB-API. Чтобы вставить переменную в строку запроса, используйте заполнитель в строке и подставьте фактические значения в запрос, предоставив их в виде tuple
значений для второго аргумента execute()
метод.
В операторе SQL может использоваться один из двух типов заполнителей: вопросительные знаки (стиль qmark) или именованные заполнители (именованный стиль). Для стиля qmark параметры должны быть sequence, длина которого должна соответствовать количеству заполнителей, иначе возникнет ProgrammingError
. Для именованного стиля parameters должен быть экземпляром dict
(или подкласса), который должен содержать ключи для всех именованных параметров; любые дополнительные элементы игнорируются. Вот пример обоих стилей:
con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE lang(name, first_appeared)")
# This is the named style used with executemany():
data = (
{"name": "C", "year": 1972},
{"name": "Fortran", "year": 1957},
{"name": "Python", "year": 1991},
{"name": "Go", "year": 2009},
)
cur.executemany("INSERT INTO lang VALUES(:name, :year)", data)
# This is the qmark style used in a SELECT query:
params = (1972,)
cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)
print(cur.fetchall())
con.close()
Informacja
PEP 249 числовые заполнители не поддерживаются. Если они используются, они будут интерпретироваться как именованные заполнители.
Как адаптировать пользовательские типы Python к значениям SQLite¶
SQLite изначально поддерживает только ограниченный набор типов данных. Чтобы хранить пользовательские типы Python в базах данных SQLite, адаптируйте их к одному из типов Python, SQLite изначально понимает.
Есть два способа адаптировать объекты Python к типам SQLite: позволить вашему объекту адаптироваться самостоятельно или использовать вызываемый адаптер. Последнее будет иметь приоритет над первым. Для библиотеки, которая экспортирует пользовательский тип, возможно, имеет смысл разрешить этому типу адаптироваться. Разработчику приложений, возможно, имеет смысл взять на себя прямой контроль путем регистрации пользовательских функций адаптера.
Как писать адаптируемые объекты¶
Предположим, у нас есть класс Point
, который представляет пару координат x
и y
в декартовой системе координат. Пара координат будет храниться в базе данных в виде текстовой строки с использованием точки с запятой для разделения координат. Это можно реализовать, добавив метод __conform__(self, протокол)
, который возвращает адаптированное значение. Объект, передаваемый в protocol, будет иметь тип PrepareProtocol
.
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __conform__(self, protocol):
if protocol is sqlite3.PrepareProtocol:
return f"{self.x};{self.y}"
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("SELECT ?", (Point(4.0, -3.2),))
print(cur.fetchone()[0])
con.close()
Как зарегистрировать вызываемые объекты адаптера¶
Другая возможность — создать функцию, которая преобразует объект Python в тип, совместимый с SQLite. Эту функцию затем можно зарегистрировать с помощью register_adapter()
.
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def adapt_point(point):
return f"{point.x};{point.y}"
sqlite3.register_adapter(Point, adapt_point)
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("SELECT ?", (Point(1.0, 2.5),))
print(cur.fetchone()[0])
con.close()
Как преобразовать значения SQLite в пользовательские типы Python¶
Написание адаптера позволяет конвертировать из пользовательских типов Python в значения SQLite. Чтобы иметь возможность конвертировать из значений SQLite в пользовательские типы Python, мы используем конвертеры.
Давайте вернемся к классу Point
. Мы сохранили координаты x и y, разделенные точкой с запятой, в виде строк в SQLite.
Сначала мы определим функцию-конвертер, которая принимает строку в качестве параметра и создает из нее объект Point
.
Informacja
Функциям преобразователя всегда передается объект bytes
, независимо от базового типа данных SQLite.
def convert_point(s):
x, y = map(float, s.split(b";"))
return Point(x, y)
Теперь нам нужно сообщить sqlite3
, когда ему следует преобразовать данное значение SQLite. Это делается при подключении к базе данных с использованием параметра detect_types функции connect()
. Есть три варианта:
Неявно: установите для detect_types значение
PARSE_DECLTYPES
Явно: установите для detect_types значение
PARSE_COLNAMES
Оба: установите для detect_types значение
sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES
. Имена столбцов имеют приоритет над объявленными типами.
Следующий пример иллюстрирует неявный и явный подходы:
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __repr__(self):
return f"Point({self.x}, {self.y})"
def adapt_point(point):
return f"{point.x};{point.y}"
def convert_point(s):
x, y = list(map(float, s.split(b";")))
return Point(x, y)
# 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()
Рецепты адаптеров и преобразователей¶
В этом разделе показаны рецепты для распространенных адаптеров и преобразователей.
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.replace(tzinfo=None).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.decode())
def convert_datetime(val):
"""Convert ISO 8601 datetime to datetime.datetime object."""
return datetime.datetime.fromisoformat(val.decode())
def convert_timestamp(val):
"""Convert Unix epoch timestamp to datetime.datetime object."""
return datetime.datetime.fromtimestamp(int(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
.
# Create and fill the table.
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(name, first_appeared)")
data = [
("C++", 1985),
("Objective-C", 1984),
]
con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data)
# 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;
# the connection object should be closed manually
con.close()
Как использовать менеджер контекста соединения¶
Объект Connection
можно использовать в качестве контекстного менеджера, который автоматически фиксирует или откатывает открытые транзакции при выходе из тела контекстного менеджера. Если тело оператора with
завершается без исключений, транзакция фиксируется. Если эта фиксация не удалась или если тело оператора with
вызывает неперехваченное исключение, транзакция откатывается. Если autocommit
имеет значение False
, новая транзакция неявно открывается после фиксации или отката.
Если после выхода из тела оператора with
нет открытой транзакции или если autocommit
имеет значение True
, контекстный менеджер ничего не делает.
Informacja
Менеджер контекста не открывает новую транзакцию неявно и не закрывает соединение. Если вам нужен менеджер закрывающего контекста, рассмотрите возможность использования contextlib.closing()
.
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()
Как работать с URI SQLite¶
Некоторые полезные приемы URI включают в себя:
Откройте базу данных в режиме только для чтения:
>>> con = sqlite3.connect("file:tutorial.db?mode=ro", uri=True)
>>> con.execute("CREATE TABLE readonly(data)")
Traceback (most recent call last):
OperationalError: attempt to write a readonly database
>>> con.close()
Не создавайте неявно новый файл базы данных, если он еще не существует; вызовет
OperationalError
, если не удастся создать новый файл:
>>> con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True)
Traceback (most recent call last):
OperationalError: unable to open database file
Создайте общую именованную базу данных в памяти:
db = "file:mem1?mode=memory&cache=shared"
con1 = sqlite3.connect(db, uri=True)
con2 = sqlite3.connect(db, uri=True)
with con1:
con1.execute("CREATE TABLE shared(data)")
con1.execute("INSERT INTO shared VALUES(28)")
res = con2.execute("SELECT data FROM shared")
assert res.fetchone() == (28,)
con1.close()
con2.close()
Дополнительную информацию об этой функции, включая список параметров, можно найти в документации по URI SQLite.
Как создавать и использовать фабрики строк¶
По умолчанию sqlite3
представляет каждую строку как tuple
. Если tuple
не соответствует вашим потребностям, вы можете использовать класс sqlite3.Row
или собственный row_factory
.
Хотя row_factory
существует как атрибут как в Cursor
, так и в Connection
, рекомендуется установить Connection.row_factory
, чтобы все курсоры, созданные из соединение будет использовать ту же фабрику строк.
Row
обеспечивает индексированный и нечувствительный к регистру именованный доступ к столбцам с минимальными затратами памяти и влиянием на производительность по сравнению с tuple
. Чтобы использовать Row
в качестве фабрики строк, назначьте его атрибуту row_factory
:
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = sqlite3.Row
Запросы теперь возвращают объекты Row
:
>>> res = con.execute("SELECT 'Earth' AS name, 6378 AS radius")
>>> row = res.fetchone()
>>> row.keys()
['name', 'radius']
>>> row[0] # Access by index.
'Earth'
>>> row["name"] # Access by name.
'Earth'
>>> row["RADIUS"] # Column names are case-insensitive.
6378
>>> con.close()
Informacja
Предложение FROM может быть опущено в операторе SELECT, как в приведенном выше примере. В таких случаях SQLite возвращает одну строку со столбцами, определенными выражениями, например литералами, с заданными псевдонимами expr AS alias
.
Вы можете создать собственный row_factory
, который возвращает каждую строку как dict
, с именами столбцов, сопоставленными со значениями:
def dict_factory(cursor, row):
fields = [column[0] for column in cursor.description]
return {key: value for key, value in zip(fields, row)}
Используя его, запросы теперь возвращают dict
вместо tuple
:
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = dict_factory
>>> for row in con.execute("SELECT 1 AS a, 2 AS b"):
... print(row)
{'a': 1, 'b': 2}
>>> con.close()
Следующая фабрика строк возвращает именованный кортеж:
from collections import namedtuple
def namedtuple_factory(cursor, row):
fields = [column[0] for column in cursor.description]
cls = namedtuple("Row", fields)
return cls._make(row)
namedtuple_factory()
можно использовать следующим образом:
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = namedtuple_factory
>>> cur = con.execute("SELECT 1 AS a, 2 AS b")
>>> row = cur.fetchone()
>>> row
Row(a=1, b=2)
>>> row[0] # Indexed access.
1
>>> row.b # Attribute access.
2
>>> con.close()
С некоторыми изменениями приведенный выше рецепт можно адаптировать для использования dataclass
или любого другого пользовательского класса вместо namedtuple
.
Как обрабатывать текстовые кодировки, отличные от UTF-8¶
По умолчанию sqlite3
использует str
для адаптации значений SQLite к типу данных TEXT
. Это хорошо работает для текста в кодировке UTF-8, но может не работать для других кодировок и недопустимого UTF-8. Для обработки таких случаев вы можете использовать собственный text_factory
.
Благодаря «гибкой типизации» SQLite нередко можно встретить столбцы таблицы с типом данных «ТЕКСТ», содержащими кодировки, отличные от UTF-8, или даже произвольные данные. Для демонстрации предположим, что у нас есть база данных с текстом в кодировке ISO-8859-2 (Latin-2), например таблица статей чешско-английского словаря. Предполагая, что теперь у нас есть экземпляр Connection
con
, подключенный к этой базе данных, мы можем декодировать текст в кодировке Latin-2, используя этот text_factory
:
con.text_factory = lambda data: str(data, encoding="latin2")
Для недопустимых UTF-8 или произвольных данных, хранящихся в столбцах таблицы TEXT
, вы можете использовать следующий метод, заимствованный из Unicode HOWTO:
con.text_factory = lambda data: str(data, errors="surrogateescape")
Informacja
API модуля sqlite3
не поддерживает строки, содержащие суррогаты.
Zobacz także
Wytłumaczenie¶
Контроль транзакций¶
sqlite3
предлагает несколько методов контроля того, когда и как открываются и закрываются транзакции базы данных. Рекомендуется использовать Управление транзакциями через атрибут autocommit., в то время как Контроль транзакций через атрибутisolation_level. сохраняет поведение до Python 3.12.
Управление транзакциями через атрибут autocommit.¶
Рекомендуемый способ управления поведением транзакции — через атрибут Connection.autocommit
, который желательно устанавливать с помощью параметра autocommit функции connect()
.
Предлагается установить для autocommit значение «False», что подразумевает контроль транзакций, совместимый с PEP 249. Это означает:
sqlite3
гарантирует, что транзакция всегда открыта, поэтомуconnect()
,Connection.commit()
иConnection.rollback()
неявно откроют новую транзакцию (сразу после закрытие отложенного, для последних двух).sqlite3
использует операторыBEGIN DEFERRED
при открытии транзакций.Транзакции должны фиксироваться явно с использованием
commit()
.Транзакции следует откатывать явно с помощью
rollback()
.Неявный откат выполняется, если база данных
close()
с ожидающими изменениями.
Установите для autocommit значение True
, чтобы включить ``режим автофиксации`_ SQLite. В этом режиме Connection.commit()
и Connection.rollback()
не действуют. Обратите внимание, что режим автоматической фиксации SQLite отличается от PEP 249-совместимого атрибута Connection.autocommit
; используйте Connection.in_transaction
для запроса режима автофиксации низкоуровневого SQLite.
Установите для autocommit значение LEGACY_TRANSACTION_CONTROL
, чтобы оставить управление транзакциями атрибуту Connection.isolation_level
. Дополнительную информацию см. в разделе sqlite3-transaction-control-isolation-level.
Контроль транзакций через атрибутisolation_level.¶
Informacja
Рекомендуемый способ управления транзакциями — через атрибут autocommit
. См. Управление транзакциями через атрибут autocommit..
Если для Connection.autocommit
установлено значение LEGACY_TRANSACTION_CONTROL
(по умолчанию), поведение транзакции контролируется с помощью атрибута Connection.isolation_level
. В противном случае isolation_level
не имеет никакого эффекта.
Если атрибут соединения isolation_level
не равен None
, новые транзакции неявно открываются до того, как execute()
и executemany()
выполнит INSERT операторы ``, ``UPDATE
, DELETE
или REPLACE
; для других операторов неявная обработка транзакций не выполняется. Используйте методы commit()
и rollback()
для фиксации и отката ожидающих транзакций соответственно. Вы можете выбрать базовое поведение транзакции SQLite`_, то есть, будет ли и какой тип операторов ``BEGIN
sqlite3
выполняться неявно, через атрибут isolation_level
.
Если isolation_level
установлен в None
, никакие транзакции неявно не открываются вообще. Это оставляет базовую библиотеку SQLite в режиме автоматической фиксации, но также позволяет пользователю выполнять собственную обработку транзакций с использованием явных операторов SQL. Базовый режим автофиксации библиотеки SQLite можно запросить с помощью атрибута in_transaction
.
Метод executescript()
неявно фиксирует любую ожидающую транзакцию перед выполнением данного SQL-скрипта, независимо от значения isolation_level
.
Zmienione w wersji 3.6: sqlite3
используется для неявной фиксации открытой транзакции перед операторами DDL. Это уже не так.
Zmienione w wersji 3.12: Рекомендуемый способ управления транзакциями теперь — через атрибут autocommit
.