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. Предполагается базовое понимание концепций баз данных, включая курсоры и транзакции.
Сначала нам нужно создать новую базу данных и открыть подключение к базе данных, чтобы модуль sqlite3 смог работать с ней. Вызовите sqlite3.connect(), чтобы создать подключение к базе данных tutorial.db в текущем рабочем каталоге, неявно создав её, если она не существует:
import sqlite3
con = sqlite3.connect("tutorial.db")
Возвращаемый объект Connection con представляет подключение к базе данных на диске.
Для выполнения SQL-запросов и извлечения результатов из SQL-запросов нам понадобится курсор базы данных. Вызовите con.cursor(), чтобы создать Cursor:
cur = con.cursor()
Теперь, когда у нас есть подключение к базе данных и курсор, мы можем создать таблицу базы данных movie со столбцами для названия, года выпуска и оценки обзора. Для простоты мы можем использовать только имена столбцов в определении таблицы — благодаря гибкому типу данных гибкости типов SQLite, указание типов данных необязательно. Выполните запрос CREATE TABLE с помощью вызова cur.execute(...):
cur.execute("CREATE TABLE movie(title, year, score)")
Мы можем проверить, что новая таблица была создана, запросив встроенную в SQLite таблицу sqlite_master, которая теперь должна содержать запись об определении таблицы movie (см. Таблица схемы для получения подробных сведений). Выполните этот запрос, вызвав 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 к запросу. Всегда используйте заглушки вместо форматирования строк для привязки значений 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")
Каждая строка — это двухэлементная 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=100, uri=False) -
Открыть подключение к базе данных SQLite.
- Параметры
-
-
database (объект-путь) – Путь к файлу базы данных для открытия. Передайте
":memory:"для открытия подключения к базе данных в оперативной памяти, а не на диске. -
timeout (float) – Сколько секунд подключение должно ждать, прежде чем генерировать исключение
OperationalError, когда таблица заблокирована. Если другое подключение открывает транзакцию для изменения таблицы, эта таблица будет заблокирована до тех пор, пока транзакция не будет подтверждена. По умолчанию пять секунд. -
detect_types (int) – Управление тем, как и нужно ли искать типы данных, которые не поддерживаются 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(по умолчанию), будет выброшено исключениеProgrammingError, если подключение к базе данных используется потоком, отличным от того, который его создал. ЕслиFalse, к подключению можно получить доступ в нескольких потоках; операции записи могут потребовать сериализации пользователем, чтобы избежать повреждения данных. Дополнительную информацию см. в разделеthreadsafety. -
factory (Connection) – Пользовательский подкласс
Connectionдля создания подключения, если не используется класс по умолчаниюConnection. -
cached_statements (int) – Количество предложений, которые
sqlite3должно кэшировать внутри для этого подключения, чтобы избежать расходов на разбор. По умолчанию 100 предложений. -
uri (bool) – Если установлено
True, database интерпретируется как URI с путем к файлу и необязательной строкой запроса. Часть схемы должна быть"file:", а путь может быть относительным или абсолютным. Строка запроса позволяет передавать параметры в SQLite, позволяя использовать различные способы работы с URI SQLite.
-
database (объект-путь) – Путь к файлу базы данных для открытия. Передайте
- Тип возвращаемого значения
Вызывает событие аудита аудита
sqlite3.connectс аргументомdatabase.Вызывает событие аудита аудита
sqlite3.connect/handleс аргументомconnection_handle.В версии 3.4: Параметр uri.
В версии 3.7: database теперь также может быть объектом-путем, а не только строкой.
В версии 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, /) -
Зарегистрировать вызываемый объект adapter для адаптации типа Python type в тип SQLite. Преобразователь вызывается с единственным аргументом — объектом Python типа type и должен вернуть значение типа, который SQLite поддерживает напрямую.
-
sqlite3.register_converter(typename, converter, /) -
Зарегистрировать вызываемый объект 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".Примечание
Поддерживается также стиль параметров DB-API
named.
-
sqlite3.sqlite_version -
Номер версии запущенной библиотеки SQLite как
string.
-
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()Обратите внимание, что уровни
threadsafetySQLITE_THREADSAFE не соответствуют уровням DB-API 2.0.
-
sqlite3.version -
Номер версии этого модуля как
string. Это не версия библиотеки SQLite.
Объекты подключения
-
class sqlite3.Connection -
Каждый открытый SQLite база данных представлен объектом
Connection, который создается с помощьюsqlite3.connect(). Их основное назначение — создание объектовCursorи Управление транзакциями.См. также
Подключение к базе данных SQLite имеет следующие атрибуты и методы:
-
cursor(factory=Cursor) -
Создает и возвращает объект
Cursor. Методcursorпринимает один необязательный параметр factory. Если он указан, он должен быть вызываемым объектом, возвращающим экземплярCursorили его подклассов.
-
commit() -
Подтверждает любые ожидающие транзакции в базе данных. Если открытых транзакций нет, этот метод ничего не делает.
-
rollback() -
Откатывает текущую транзакцию к началу. Если открытых транзакций нет, этот метод ничего не делает.
-
close() -
Закрывает подключение к базе данных. Любые ожидающие транзакции не подтверждаются неявно; убедитесь, что вы
commit()перед закрытием, чтобы избежать потери несохранённых изменений.
-
execute(sql, parameters=(), /) -
Создаёт новый объект
Cursorи вызываетexecute()на нём с заданным sql и parameters. Возвращает новый объект курсора.
-
executemany(sql, parameters, /) -
Создаёт новый объект
Cursorи вызываетexecutemany()на нём с заданным sql и parameters. Возвращает новый объект курсора.
-
executescript(sql_script, /) -
Создаёт новый объект
Cursorи вызываетexecutescript()на нём с заданным sql_script. Возвращает новый объект курсора.
-
create_function(name, narg, func, *, deterministic=False) -
Создаёт или удаляет пользовательскую SQL-функцию.
- Parameters
-
- name (строка) – Имя SQL-функции.
-
narg (целое число) – Количество аргументов, которые может принимать SQL-функция. Если
-1, она может принимать любое количество аргументов. -
func (обратный вызов | None) – Вызываемый объект, который вызывается при вызове SQL-функции. Вызываемый объект должен возвращать тип, напрямую поддерживаемый SQLite. Установите в
Noneдля удаления существующей SQL-функции. -
deterministic (логическое значение) – Если
True, созданная SQL-функция помечается как детерминированная, что позволяет SQLite выполнять дополнительные оптимизации.
- Raises
-
NotSupportedError – Если deterministic используется с версиями SQLite, младше 3.8.3.
New in version 3.8: Параметр deterministic.
Пример:
>>> 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',)
-
create_aggregate(name, /, n_arg, aggregate_class) -
Создаёт или удаляет пользовательскую SQL-функцию агрегации.
- Parameters
-
- name (строка) – Имя SQL-функции агрегации.
-
n_arg (целое число) – Количество аргументов, которые может принимать SQL-функция агрегации. Если
-1, она может принимать любое количество аргументов. -
aggregate_class (класс | None) –
Класс должен реализовывать следующие методы:
-
step(): Добавляет строку в агрегат. -
finalize(): Возвращает конечный результат агрегата как тип, напрямую поддерживаемый SQLite.
Количество аргументов, которые должен принимать метод
step(), контролируется параметром n_arg.Установите в
Noneдля удаления существующей SQL-функции агрегации. -
Пример:
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()
-
create_collation(name, callable) -
Создаёт сортировку под названием name, используя функцию сортировки callable. callable получает два аргумента типа
string, и должен возвращатьinteger:-
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. -
-
interrupt() -
Вызовите этот метод из другого потока, чтобы прервать любые запросы, которые могут выполняться в соединении. Прерванные запросы будут генерировать исключение
OperationalError.
-
Регистрирует вызываемый объект authorizer_callback для вызова при каждой попытке доступа к столбцу таблицы в базе данных. Обратный вызов должен вернуть одно из значений
SQLITE_OK,SQLITE_DENYилиSQLITE_IGNOREдля указания, как следует обработать доступ к столбцу в базовой библиотеке SQLite.Первый аргумент обратного вызова указывает, какой тип операции должен быть авторизован. Второй и третий аргументы будут аргументами или
Noneв зависимости от первого аргумента. Четвёртый аргумент — имя базы данных («main», «temp» и т. д.), если применимо. Пятый аргумент — имя вложенного триггера или представления, ответственного за попытку доступа, или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(). Другие источники включают управление транзакциями управлением транзакциями модуля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.Вызывает событие аудита событие аудита
sqlite3.enable_load_extensionс аргументамиconnection,enabled.Добавлена в версии 3.2.
Изменено в версии 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) con.close()
-
load_extension(path, /) -
Загрузить SQLite-расширение из общей библиотеки, расположенной по пути path. Включите загрузку расширений с помощью
enable_load_extension()перед вызовом этого метода.Вызывает событие аудита событие аудита
sqlite3.load_extensionс аргументамиconnection,path.Добавлена в версии 3.2.
Изменено в версии 3.10: Добавлено событие аудита
sqlite3.load_extension.
-
iterdump() -
Возвращает итератор для вывода базы данных в виде исходного кода SQL. Полезно при сохранении базы данных в памяти для последующего восстановления. Аналогично команде
.dumpв оболочке sqlite3.Пример:
# 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()
-
backup(target, *, pages=- 1, progress=None, name='main', sleep=0.250) -
Создать резервную копию SQLite-базы данных.
Работает даже если база данных используется другими клиентами или одновременно той же подключением.
- Параметры
-
- target (Connection) – Соединение базы данных для сохранения резервной копии.
-
pages (int) – Количество страниц для копирования за один раз. Если равно или меньше
0, вся база данных копируется за один шаг. По умолчанию-1. -
progress (callback | None) – Если установлено в вызываемый объект, вызывается с тремя целочисленными аргументами для каждой итерации резервного копирования: состояние последней итерации, оставшееся число страниц, которые ещё нужно скопировать, и общее число страниц. По умолчанию
None. -
name (str) – Имя базы данных для создания резервной копии. Либо
"main"(по умолчанию) для основной базы данных,"temp"для временной базы данных, или имя настраиваемой базы данных, присоединённой с помощьюATTACH DATABASESQL-запроса. - 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)Добавлена в версии 3.7.
-
in_transaction -
Это только для чтения атрибут соответствует базовому SQLite режиму автоподтверждения.
Trueесли транзакция активна (есть несохранённые изменения),Falseв противном случае.Добавлена в версии 3.2.
-
isolation_level -
Этот атрибут управляет обработкой транзакций, выполняемой
sqlite3. Если установлено вNone, транзакции никогда не открываются неявно. Если установлено в одно из"DEFERRED","IMMEDIATE", или"EXCLUSIVE", соответствующие поведению транзакций SQLite, выполняется неявное управление транзакциями.Если не переопределено параметром isolation_level в
connect(), по умолчанию"", что является псевдонимом"DEFERRED".
-
row_factory -
Начальный
row_factoryдля объектовCursor, созданных из этого соединения. Присвоение этому атрибуту не влияет наrow_factoryсуществующих курсоров, принадлежащих этому соединению, только на новые. По умолчаниюNoneэто означает, что каждая строка возвращается какtuple.Для получения более подробной информации см. Как создать и использовать фабрики строк.
-
text_factory -
Вызываемый объект, принимающий
bytesпараметр и возвращающий текстовое представление. Вызываемый объект вызывается для значений SQLite с типом данныхTEXT. По умолчанию этот атрибут установлен наstr. Если вы хотите вернутьbytesвместо этого, установите text_factory наbytes.Пример:
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 представляет собой курсор базы данных, используемый для выполнения 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 с помощью заменителей.
- Параметры
-
- sql (str) – Одно SQL-утверждение.
-
parameters (
dict| последовательность) – Значения Python для привязки к заменителям в sql. Словарь если используются именованные замены. Последовательность если используются безымянные замены. См. Как использовать замены для привязки значений в SQL-запросах.
- Исключения
-
Предупреждение – Если sql содержит более одного SQL-утверждения.
Если
isolation_levelнеNone, sql являетсяINSERT,UPDATE,DELETE, илиREPLACEутверждением, и нет открытой транзакции, транзакция неявно открывается перед выполнением sql.Используйте
executescript()для выполнения нескольких SQL-утверждений.
-
executemany(sql, parameters, /) -
Для каждого элемента в parameters, повторяет выполнение параметризованного SQL-утверждения sql.
Использует ту же обработку неявной транзакции, что и
execute().- Параметры
-
- sql (str) – Одно SQL-утверждение DML.
- parameters (итерируемый объект) – Итерируемый объект параметров для привязки к заменителям в sql. См. Как использовать замены для привязки значений в SQL-запросах.
- Исключения
-
- Ошибка программирования – Если sql не является утверждением DML.
- Предупреждение – Если sql содержит более одного SQL-утверждения.
Пример:
rows = [ ("row1",), ("row2",), ] # cur is an sqlite3.Cursor object cur.executemany("INSERT INTO data VALUES(?)", rows)
-
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() -
Если
row_factoryNone, возвращает следующую строку результата запроса как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
-
description -
Только для чтения атрибут, который предоставляет имена столбцов последнего запроса. Для совместимости с Python DB API он возвращает кортеж из 7 элементов для каждого столбца, где последние шесть элементов каждого кортежа
None.Он устанавливается для
SELECTутверждений без соответствующих строк.
-
lastrowid -
Только для чтения атрибут, который предоставляет идентификатор строки последней вставленной строки. Он обновляется только после успешного
INSERTилиREPLACEутверждений с использованием методаexecute(). Для других утверждений, послеexecutemany()илиexecutescript(), или если вставка не удалась, значениеlastrowidостается неизменным. Начальное значениеlastrowidравноNone.Примечание
Вставки в
WITHOUT ROWIDтаблицы не регистрируются.Изменено в версии 3.6: Добавлена поддержка
REPLACEутверждения.
-
rowcount -
Только для чтения атрибут, который предоставляет количество измененных строк для
INSERT,UPDATE,DELETE, иREPLACEутверждений; равно-1для других утверждений, включая запросы CTE. Он обновляется только методамиexecute()иexecutemany().
-
-
row_factory -
Управление тем, как отображается строка, извлеченная из этого
Cursor. ЕслиNone, строка представлена какtuple. Может быть установлено в включенныйsqlite3.Rowили в вызываемый объект, принимающий два аргумента: объектCursorи список значений строки, и возвращающий пользовательский объект, представляющий строку SQLite.По умолчанию используется значение, установленное для
Connection.row_factoryпри созданииCursor. Присвоение этому атрибуту не влияет наConnection.row_factoryродительского соединения.См. Как создать и использовать фабрики строк для получения дополнительных сведений.
-
Объекты строк
-
class sqlite3.Row -
Экземпляр
Rowслужит высокооптимизированнойrow_factoryдля объектовConnection. Поддерживает итерацию, проверку на равенство,len()и доступ к данным по имени столбца и индексу (как в словаре).Два объекта
Rowравны, если у них одинаковые имена столбцов и значения.См. Как создать и использовать фабрики строк для получения дополнительных сведений.
-
keys() -
Возвращает
listимен столбцов в видеstrings. Сразу после запроса это первый элемент каждого кортежа вCursor.description.
Изменено в версии 3.5: Добавлена поддержка срезов.
-
Объекты PrepareProtocol
-
class sqlite3.PrepareProtocol -
Единственная цель типа PrepareProtocol — действовать как протокол адаптации в стиле PEP 246 для объектов, которые могут адаптировать себя к родным типам SQLite.
Исключения
Иерархия исключений определяется 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, например, при попытке выполнить операцию над закрытым
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 с помощью адаптеров объектов, и вы можете позволить модулю sqlite3 преобразовывать типы SQLite в типы Python с помощью конвертеров.
Конвертеры и адаптеры по умолчанию
Существуют адаптеры по умолчанию для типов date и datetime в модуле datetime. Они будут отправляться в SQLite как даты ISO/временные метки 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().
Руководства по использованию
Как использовать плейсхолдеры для привязки значений в 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. Для именованного стиля параметры должны быть экземпляром 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())
Примечание
Числовые плейсхолдеры 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])
Как зарегистрировать вызываемые адаптеры
Другой вариант — создать функцию, преобразующую объект 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])
Как преобразовать значения 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. Имена столбцов имеют приоритет перед объявленными типами.
Следующий пример иллюстрирует неявный и явный подходы:
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])
Рецепты адаптеров и конвертеров
В этом разделе представлены рецепты для общих адаптеров и конвертеров.
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.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 вызывает необработанное исключение, транзакция откатывается.
Если при выходе из тела оператора with транзакции нет, менеджер контекста бездействует.
Примечание
Менеджер контекста не неявно открывает новую транзакцию и не закрывает соединение.
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()
Как работать с SQLite URI
Некоторые полезные хитрости с 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
- Не создавать неявно новый файл базы данных, если он не существует; вызовет
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,)
Дополнительную информацию об этой функции, включая список параметров, можно найти в документации SQLite URI.
Как создавать и использовать фабрики строк
По умолчанию, 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
Вы можете создать пользовательскую 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}
Следующая фабрика строк возвращает именованную кортеж:
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
С некоторыми изменениями вышеупомянутый пример можно адаптировать для использования dataclass или любого другого пользовательского класса вместо namedtuple.
Описание
Управление транзакциями
Модуль sqlite3 не соответствует рекомендациям по обработке транзакций, предложенным PEP 249.
Если атрибут подключения 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.
Изменено в версии 3.6: sqlite3 раньше неявно коммитил открытую транзакцию перед операторами DDL. Теперь этого не происходит.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/sqlite3.html