Сообщить об ошибке.

Драйвер для баз данных SQLite3.

SQLite - это библиотека языка C, которая предоставляет легковесную дисковую базу данных. База данных SQLite не требует отдельного серверного процесса и позволяет получить доступ к базе данных, используя нестандартный вариант языка запросов SQL.
Некоторые приложения могут использовать SQLite для внутреннего хранения данных. Также возможно создать прототип приложения с использованием SQLite, а затем перенести код в большую базу данных, такую ​​как PostgreSQL или Oracle.
Модуль sqlite3 обеспечивает интерфейс SQL, совместимый со спецификацией DB-API 2.0, описанной в PEP 249.

Многопоточность.

В старых версиях SQLite возникали проблемы с разделением соединений между потоками. По этому модуль sqlite3 Python запрещает разделять соединения и курсоры между потоками. Если попытаться это сделать, то получим исключение во время выполнения.
Единственным методом, имеющим смысл вызывать только из другого потока является вызов метода connect.interrupt().

Примеры использования:

Чтобы использовать модуль, необходимо сначала создать объект Connection, который представляет базу данных. В примерах, данные будут храниться в файле example.db:
import sqlite3
conn = sqlite3.connect('example.db')
Можно также указать специальное имя :memory: для создания базы данных в оперативной памяти.
Получив соединение Connection, можно создать объект Cursor и вызвать его метод cursor.execute() для выполнения команд SQL:
cursor = conn.cursor()

# Создать таблицу
cursor.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')

# Вставить строку данных
cursor.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")

# Сохранить (зафиксировать) изменения
conn.commit()

# Можно закрыть соединение, если оно больше не нужно.
# Убедитесь, что все изменения были зафиксированы, или они будут потеряны.
conn.close()
Данные, которые были сохранены, являются постоянными и доступны в следующих сеансах:
import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
Обычно операции SQL могут использовать значения из переменных в Python. Нет необходимости собирать запрос, используя строковые операции Python, потому что это небезопасно. Это делает программу уязвимой для атаки SQL-инъекцией.
Вместо этого используйте подстановку параметров DB-API. Поставьте символ '?' в качестве заполнителя везде, где вы хотите использовать значение переменной, а затем предоставьте кортеж значений в качестве второго аргумента метода курсора cursor.execute(). Другие модули базы данных могут использовать другой заполнитель, такой как '%s' или ':1'.
Например:
# Никогда не делай этого - небезопасно!
symbol = 'RHAT'
cursor.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

# Делайте все время так, как показано ниже.
t = ('RHAT',)
cursor.execute('SELECT * FROM stocks WHERE symbol=?', t)
print(cursor.fetchone())

# Larger example that inserts many records at a time
purchases = [('2020-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2020-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2020-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
cursor.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
Чтобы получить данные после выполнения оператора SELECT, можно либо обработать курсор как итератор, вызвать метод курсора cursor.fetchone(), чтобы получить единственную совпадающую строку, либо вызвать cursor.fetchall(), чтобы получить список совпадающих строк.
В этом примере используется форма итератора:
>>> for row in cursor.execute('SELECT * FROM stocks ORDER BY price'):
...      print(row)
...
# ('2020-01-05', 'BUY', 'RHAT', 100, 35.14)
# ('2020-03-28', 'BUY', 'IBM', 1000, 45.0)
# ('2020-04-06', 'SELL', 'IBM', 500, 53.0)
# ('2020-04-05', 'BUY', 'MSFT', 1000, 72.0)