Как установить sqlite3 python
Перейти к содержимому

Как установить sqlite3 python

  • автор:

SQLite

Python по умолчанию поддерживает работу с базой данных SQLite. Для этого применяется встроенная библиотека sqlite3 , которая в python доступна в виде одноименного модуля.

Для подключения к бд в этой библиотеке определена функция connect() :

sqlite3.connect(database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=128, uri=False)

Она принимает следующие параметры:

  • database : путь к файлу базы данных. Если база данных расположена в памяти, а не на диске, то для открытия подключения используется «:memory:»
  • timeout : период времени в секундах, через который генерируется исключение, если файл бд занят другим процессом
  • detect_types : управляет сопоставлением типов SQLite с типами Python. Значение 0 отключает сопоставление
  • isolation_level : устанавливает уровень изоляции подключения и определяет процесс отрытия неявных транзакций. Возможные значения: «DEFERRED» (значение по умолчанию), «EXCLUSIVE», «IMMEDIATE» или None (неявные транзакции отключены)
  • check_same_thread : если равно True (значение по умолчанию), то только поток, который создал подключение, может его использовать. Если равно False , подключение может использоваться несколькими потоками.
  • factory : класс фабрики, который применяется для создания подключения. Должен представлять класс, производный от Connection . По умолчанию используется класс sqlite3.Connection
  • cached_statements : количество SQL-инструкций, которые должны кэшироваться. По умолчанию равно 128.
  • uri : булевое значение, если равно True , то путь к базе данных рассматривается как адрес URI

Обязательным параметром функции является путь к базе данных. Результатом функции является объект подключения (объект класса Connection), через затем можно взаимодействовать с базой данных.

Например, подключение к базе данных «metanit.db», которая располагается в той же папке, что и текущий скрипт (если такая база данных отсутствует, то она автоматически создается):

import sqlite3; con = sqlite3.connect("metanit.db")

Сопоставление типов SQLite и Python

Прежде чем начать работать с базой данных, следует понимать, как сопоставляются типы SQLite и типы Python. По умолчанию применяются следующие сопоставления:

Следует отметить, что при необходимости мы можем переопределять сопоставление, применяя кастомные конвертеры типов.

Получение курсора

Для выполнения выражений SQL и получения данных из БД, необходимо создать курсор. Для этого у объекта Connection вызывается метод cursor() . Этот метод возвращает объект Cursor :

import sqlite3; # создаем подключение con = sqlite3.connect("metanit.db") # получаем курсор cursor = con.cursor()

Выполнение запросов к базе данных

Для выполнения запросов и получения данных класс Cursor предоставляет ряд методов:

  • execute(sql, parameters=(), /) : выполняет одну SQL-инструкцию. Через второй параметр в код SQL можно передать набор параметров в виде списка или словаря
  • executemany(sql, parameters, /) : выполняет параметризованное SQL-инструкцию. Через второй параметр принимает наборы значений, которые передаются в выполняемый код SQL.
  • executescript(sql_script, /) : выполняет SQL-скрипт, который может включать множество SQL-инструкций
  • fetchone() : возвращает одну строку в виде кортежа из полученного из БД набора строк
  • fetchmany(size=cursor.arraysize) : возвращает набор строк в виде списка. количество возвращаемых строк передается через параметр. Если больше строк нет в наборе, то возвращается пустой список.
  • fetchall() : возвращает все (оставшиеся) строки в виде списка. При отсутствии строк возвращается пустой список.

Создание таблицы

Для создания таблицы в SQLite применяется инструкция CREATE TABLE . Например, создадим в базе данных «metanit.db» таблицу people:

import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() # создаем таблицу people cursor.execute("""CREATE TABLE people (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER) """)

В метод cursor.execute() передается инструкция CREATE TABLE , которая создает таблицу people с тремя столбцами. Столбец id представляет идентификатор пользователя, хранит данные типа Integer, то есть число, и также представляет первичный ключ, значение которого будет автоматически генерироваться и инкрементироваться с каждой новой строкой. Второй столбец — name представляет строку — имя пользователя. И третий столбец — age представляет возраст пользователя.

После выполнения скрипта мы можем открыть базу данных в каком-нибудь браузере баз данных SQLite, например, в DB Browser for SQLite и увидеть созданную таблицу

Работа с SqLite3 в Python

Базы данных и работа с ними заслуживают отдельного раздела, здесь же мы рассмотрим в чем заключается работа с SqLite3 в Python.

Установка SqLite3

Итак, SqLite3 в Python не является стандартным модулем и требует дополнительной установки. Что бы проверить, установлен ли у вас модуль SqLite3 пишем в терминале:

sqlite3

Исли вы получите сообщение, что эта команда не определена, то ее надо установить, на Macbook она предустановлена, для Windows – устанавливаем!

  1. Переходим на официальный сайт sqlite.org
  2. Находим раздел Precompiled Binaries for Windows
  3. Если у вас 32-х битная система, то скачиваем 1й и 3й архив
  4. Если у вас 64-х битная система, то скачиваем 1й и 2й арсив
  5. После чего оба архива нужно распаковать, не имеет значения на какой диск, предварительно создав дирректорию для помещения в нее файлов архива. Для примера, я это сделаю в корневую дирректори диска С и назову sqlite
  6. Нужно добавить пути: переходим Этот компьютер – Свойства – Дополнительные параметры системы – Переменные среды – Path – ИзменитьСоздать и прописываем c:\sqlite, нажимаем ОК (закрываем ранее открытые окна)

работа с SqLite3 в Python

Теперь, когда вы откроете командную строку и пропишите команду для проверки, у вас будет выведено сообщение с версией SqLite.

Создание таблицы и полей в таблице в SqLite3

Объявим объект подключения, для чего воспользуемся функцией connect(), в которую передадим строку с путем к БД. Не менее важен и другой параметр, timeout, отвечающий за длительность подключения к базе данных. Если за отведенное время оно не установится, будет сгенерировано соответствующее исключение, а программа продолжит свою работу или разобьется о консоль. Сделаем этот параметр равным пяти секундам, передав вызову соответствующее значение:

connection = sqlite3.connect("Student_DB.db", 5)

Теперь создадим курсор – общепринятое название для объекта, который непосредственно работает с подключением, передавая и обрабатывая SQL-запросы и сохраняя в себе результат их выполнения. Сделаем это с помощью метода cursor() объекта подключения:

cur = connection.cursor()

Добавим строки с выводом на экран объявленных элементов. Последней запишем команду для закрытия подключения с помощью метода close(). Если этого не сделать, подключение останется открытым даже после завершения выполнения программы, что впоследствии может привести к невозможности нового соединения, поскольку все возможные линии связи будут заняты:

print(connection) print(cur) connection.close()

Подключение выполнено, но наша база пока пуста. Начнем ее наполнение, создав первую таблицу. Для этого в метод execute() курсора передадим строку с SQL-запросом “CREATE TABLE first_table (name TEXT);”. Теперь вызовем метод commit() объекта подключения. Он нужен для закрытия транзакции – специального способа одновременной передачи большого количества изменений, что позволяет избежать проблем с целостностью данных:

import sqlite3 connection = sqlite3.connect("Student_DB.db", 5) cur = connection.cursor() cur.execute("CREATE TABLE first_table (name TEXT);") connection.commit() connection.close()

Если же вам необходимо создать несколько полей, не только name, а допустим еще и lastName, age, phone, то срока будет выглядеть вот так:

cur.execute("CREATE TABLE first_table (name TEXT, lastName TEXT, age INTEGER, phone TEXT);")

На самом деле, вам может показать что работа с SqLite3 в Python сложная из-за того, что мало визуализации, но на самом деле это можно исправить с помощью плагина Database Navigator, и мы это сделаем позже, а сейчас давайте заполним таблицу данными, для этого пропишем вот такую команду:

cur.execute("INSERT INTO first_table (name) VALUES ('Nick');")

Т.е. в таблицу first_table, поле name установим значение “Nick”
Ну, и если вам необходимо вносить данные не в одно поле, как в моем примере выше, а сразу в несколько полей, то делается это вот так:

cur.execute("INSERT INTO first_table (name, lastName, age, phone) VALUES ('Nick', 'Petrov', 28, '+380987856321');")

INSERT INTO – команда о внесении данных;

first_table – в какую именно таблицу вносим;

(name, lastName, age, phone) – в какие поля таблицы вносим данные;

(‘Nick’, ‘Petrov’, 28, ‘+380987856321’) – сами данные.

Очень интересный момент, что эту строку внесения данных можно записать в переменную и ее передать в метод execut:

data_user = "INSERT INTO first_table (name, lastName, age, phone) VALUES ('Nick', 'Petrov', 28, '+380987856321');" cur.execute(data_user)

Но здесь мы прописываем данные прямо в запросе, что не очень удобно! Очень часто, почти всегда, мы данные получаем откуда-то, либо нам их передают по сети, и здесь очень важно и правильно было бы данные в запрос подставлять в виде переменных! И здесь нам могут помочь так называемы f-строки, но сразу оговоримся, это не очень безопасный способ:

name = 'Nick' lastName = 'Petrov' age = 28 phone = '+380987856321' request_data = f"INSERT INTO first_table (name, lastName, age, phone) VALUES ('', '', , '');" cur.execute(request_data)

Но, как уже сказано было выше, это не безопасный способ, приведен в качестве объяснения, что вместо прямой передачи переменных можно использовать подстановочные символы, а именно “?”.

Для этого в методе execute необходимо передать вторым параметром кортеж с нашими переменными, а в запросе просто поставить подстановочные символы, т.е. “?”:

name = 'Nick' lastName = 'Petrov' age = 28 phone = '+380987856321' request_data = "INSERT INTO first_table (name, lastName, age, phone) VALUES (?, ?, ?, ?);" cur.execute(request_data, (name, lastName, age, phone))

Или же мы заранее создадим кортеж с нашими данными, а потом передадим просто его:

name = 'Nick' lastName = 'Petrov' age = 28 phone = '+380987856321' data = (name, lastName, age, phone) request_data = f"INSERT INTO first_table (name, lastName, age, phone) VALUES (?, ?, ?, ?);" cur.execute(request_data, data)

И вот здесь и начинается самое интересное, и появляется вся работа с SqLite3 в Python. Понятное дело, что кортежи не изменяемые типы данных, их и не только их мы описали в статье Типы данных языка программирования Python, и их мы не можем динамечески создавать, но мы можем создавать списки, добавлять и корректировать в них данные, или словари, или даже получать по API данные в виде json, извлекать с него ту информацию, которая нам нужна, преобразовывать в тип данных tuple и уже его передавать в метод execute для записи в базу данных.

Простой пример: мы получаем данные с сервера, создаем из них кортежи, далее эти кортежи добавляем в список как отдельные элементы, т.е. будем иметь список кортежей, и потом в цикле перебираем все элементы этого списка и отправляем запросы на добавление в БД. Код будет иметь примерно такой вид:

data_lst = [('Nick', 'Petrov', 28, '+380987856321'), ('Ivan', 'Ivanov', 25, '+380669632541'), ('Anna', 'Urkova', 18, '+380875632147')] request_data = f"INSERT INTO first_table (name, lastName, age, phone) VALUES (?, ?, ?, ?);" for data in data_lst: cur.execute(request_data, data)

Но есть и второй вариант, это использовать метод executemany, и кроме запроса передать в него список кортежей, таким образом цикл нам не нужен, этот метод их сам перебирает:

data_lst = [('Nick', 'Petrov', 28, '+380987856321'), ('Ivan', 'Ivanov', 25, '+380669632541'), ('Anna', 'Urkova', 18, '+380875632147')] request_data = f"INSERT INTO first_table (name, lastName, age, phone) VALUES (?, ?, ?, ?);" cur.executemany(request_data, data_lst)

Чтение данных с БД при помощи Python

Для получения данных с БД необходимо использовать запрос SELECT, помещая данные в объект курсора, и в дальнейшем обращаться с ним как с итерируемым объектом, т.е. перебирать в цикле:

cur.execute("SELECT * FROM first_table;") for row in cur: print(row)

Там образом мы распечатаем каждую строку из нашей БД. Но в большинстве случаев нам не надо вся таблица, а данные выборочные! Для этого пропишем условие с помощью ключевого слова WHERE:

cur.execute("SELECT * FROM first_table WHERE name IS 'Nick';") for row in cur: print(row)

И получаем данные только с тех строк, у которых в поле name есть значение “Nick”. Если же нам нужны какие-то конкретные поля, то мы можем написать запрос так:

cur.execute("SELECT name, age FROM first_table;")

И получим только имена и возраст с нашей таблицы.

Для получения отдельных строк необходимо использовать метод fetchone()

cur.execute("SELECT * FROM first_table WHERE name IS 'Nick';") print(cur.fetchone())

И выводим на консоль первую строку с таблицы, где name = “Nick”

Что бы получить все строки можно использовать метод fetchall()

cur.execute("SELECT * FROM first_table WHERE name IS 'Nick';") print(cur.fetchall())

И получим все строки, где name = “Nick”.

Обновление данных с БД при помощи Python

Для обновления данных используется ключевое слово UPDATE, и далее указываем что именно обновить с помощью ключевого слова SET и условие, т.е. в какой именно строке:

cur.execute("UPDATE first_table SET age = 26 WHERE name IS 'Nick';")

Ну, и что бы посмотреть данные в таблице, необходимо сделать выборку с помощь SELECT, и либо циклом пробежаться по курсору, либо применить метод fetchall()

cur.execute("SELECT * FROM first_table") date = cur.fetchall() #Возвращает список кортежей [print(row) for row in data] # перебираем список и выводим в консоль

И после UPDATE мы увидим, что значение age изменилось на 26.

Если нам необходимо, допустим, изменить номер телефона поля с name = ‘Anna’, то для этого пишем:

cur.execute("UPDATE first_table SET phone = '+78070000000' WHERE name IS 'Anna';")

Удаление данных с БД SqLite3

Для удаления используется ключевое слово DELETE, и если нам надо, допустим удалить запись с name = “Ivan”, то запрос будет выглядеть вот так:

cur.execute("DELETE FROM first_table WHERE name IS 'Ivan';")

Если выполнить запрос на просмотр, то это поле будет уже пустым.

В этой стать мы пытались показать, что работа с SqLite3 в Python это просто и легко, не смотря на отсутствие визуализации сохранения данных, но о плагине DB Navigator мы все таки вспоминали. Если вам интересно, как работать с ним, посмотрите статью DB Navigator Pycharm.

Введение в SQLite Python

Цель этого руководства — продемонстрировать принципы разработки приложений на Python с использованием базы данных SQLite.

Подключение к SQLite в Python

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

Для установки соединения нужно указать название базы данных, к которой требуется подключиться. Если указать название той, что уже есть на диске, то произойдет подключение. Если же указать другое, то SQLite создаст новую базу данных.

Для подключения к SQLite нужно выполнить следующие шаги

  • Использовать метод connect() из модуля sqlite3 и передать в качестве аргумента название базы данных.
  • Создать объект cursor с помощью объекта соединения, который вернул прошлый метод для выполнения SQLite-запросов из Python.
  • Закрыть объект cursor после завершения работы.
  • Перехватить исключение базы данных, если в процессе подключения произошла ошибка.

Следующая программа создает файл базы данных sqlite_python.db и выводит подробности о версии SQLite.

 
import sqlite3

try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("База данных создана и успешно подключена к SQLite")

sqlite_select_query = "select sqlite_version();"
cursor.execute(sqlite_select_query)
record = cursor.fetchall()
print("Версия базы данных SQLite: ", record)
cursor.close()

except sqlite3.Error as error:
print("Ошибка при подключении к sqlite", error)
finally:
if (sqlite_connection):
sqlite_connection.close()
print("Соединение с SQLite закрыто")

После подключения должно появиться следующее сообщение.

База данных создана и успешно подключена к SQLite Версия базы данных SQLite: [('3.31.1',)] Соединение с SQLite закрыто

Понимание SQLite-подключения в подробностях

  • Эта строка импортирует в программу модуль sqlite3. С помощью классов и методов из этого модуля можно взаимодействовать с базой данных SQLite.
  • С помощью метода connect() выполняется подключение к базе данных. Этот метод возвращает объект подключения SQLite.
  • Объект connection не является потокобезопасным. Модуль sqlite3 не позволяет делиться подключением между потоками. Если попытаться сделать это, то можно получить исключение.
  • Метод connect() принимает разные аргументы. В этом примере передается название базы данных.
  • С помощью объекта соединения создается объект cursor , который позволяет выполнять SQLite-запросы из Python.
  • Для одного соединения можно создать неограниченное количество cursor. Он также не является потокобезопасным. Модуль не позволяет делиться объектами cursor между потоками. Если это сделать, то будет ошибка.

После этого создается запрос для получения версии базы данных.

  • С помощью метода execute объекта cursor можно выполнить запрос в базу данных из Python. Он принимает SQLite-запрос в качестве параметра и возвращает resultSet — то есть, строки базы данных
  • Получить результат запроса из resultSet можно с помощью методов, например, fetchAll()
  • В этом примере SELECT version(); выполняется для получения версии базы данных SQLite.

Блок try-except-finally: весь код расположен в блоке try-except, что позволит перехватить исключения и ошибки базы данных, которые могут появиться в процессе.

  • С помощью класса sqlite3.Error можно обработать любую ошибку и исключение, которые могут появиться при работе с SQLite из Python.
  • Это позволит сделать приложение более отказоустойчивым. Класс sqlite3.Error позволит понять суть ошибки. Он возвращает сообщение и код ошибки.

cursor.close() и connection.close()

  • Хорошей практикой считается закрывать объекты connection и curosor после завершения работы, чтобы избежать проблем с базой данных.

Создание таблицы SQLite в Python

В этом разделе разберемся, как создавать таблицы в базе данных SQLite с помощью Python и модуля sqlite3. Создание таблицы — это DDL-запрос, выполняемый из Python.

В этом примере создадим базу sqlitedb_developers в базе данных sqlite_python.db .

Шаги для создания таблицы в SQLite с помощью Python:

  • Соединиться с базой данных с помощью sqlite3.connect() . Речь об этом шла в первом разделе.
  • Подготовить запрос создания таблицы.
  • Выполнить запрос с помощью cursor.execute(query) .
  • Закрыть соединение с базой и объектом cursor .
 
import sqlite3

try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
sqlite_create_table_query = '''CREATE TABLE sqlitedb_developers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email text NOT NULL UNIQUE,
joining_date datetime,
salary REAL NOT NULL);'''

cursor = sqlite_connection.cursor()
print("База данных подключена к SQLite")
cursor.execute(sqlite_create_table_query)
sqlite_connection.commit()
print("Таблица SQLite создана")

cursor.close()

except sqlite3.Error as error:
print("Ошибка при подключении к sqlite", error)
finally:
if (sqlite_connection):
sqlite_connection.close()
print("Соединение с SQLite закрыто")
База данных подключена к SQLite Таблица SQLite создана Соединение с SQLite закрыто

Создание таблицы SQLite в Python

Типы данных SQLite и соответствие типам Python

Перед переходом к выполнению CRUD-операций в SQLite из Python сначала нужно разобраться с типами данных SQLite и соответствующими им типами данных в Python, которые помогают хранить и считывать данные из таблицы.

У движка SQLite есть несколько классов для хранения значений. Каждое значение, хранящееся в базе данных, имеет один из следующих типов или классов.

Типы данных SQLite:

  • NULL — значение NULL
  • INTEGER — числовые значения. Целые числа хранятся в 1, 2, 3, 4, 6 и 8 байтах в зависимости от величины
  • REAL — числа с плавающей точкой, например, 3.14, число Пи
  • TEXT — текстовые значения. Могут храниться в кодировке UTF-8, UTF-16BE или UTF-16LE
  • BLOB — бинарные данные. Для хранения изображений и файлов

Следующие типы данных из Python без проблем конвертируются в SQLite. Для конвертации достаточно лишь запомнить эту таблицу.

Тип Python Тип SQLite
None NULL
int INTEGER
float REAL
str TEXT
bytes BLOB

Выполнение SQL запросов с помощью функции executescript

Скрипты SQLite отлично справляются со стандартными задачами. Это набор SQL-команд, сохраненных в файле (в формате .sql). Один файл содержит одну или больше SQL-операций, которые затем выполняются из командной строки.

Дальше несколько распространенных сценариев использования SQL-скриптов

  • Создание резервных копий сразу нескольких баз данных за раз.
  • Сравнение количества строк двух разных баз с одной схемой.
  • Создание всех таблиц в одном скрипте, что позволит создать нужную схему на любом сервере

Выполнить скрипт из командной строки SQLite можно с помощью команды .read :

sqlite> .read sqlitescript.sql

Например, этот простой скрипт создает две таблицы.

CREATE TABLE fruits ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, price REAL NOT NULL ); CREATE TABLE drinks ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, price REAL NOT NULL );

Теперь посмотрим, как выполнить его из Python.

 
import sqlite3

try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("База данных подключена к SQLite")

with open('sqlite_create_tables.sql', 'r') as sqlite_file:
sql_script = sqlite_file.read()

cursor.executescript(sql_script)
print("Скрипт SQLite успешно выполнен")
cursor.close()

except sqlite3.Error as error:
print("Ошибка при подключении к sqlite", error)
finally:
if (sqlite_connection):
sqlite_connection.close()
print("Соединение с SQLite закрыто")

Выполнение SQL запросов с помощью функции executescript

Таблицы SQLite создаются за счет выполнения скрипта из Python. Вывод:

База данных подключена к SQLite Скрипт SQLite успешно выполнен Соединение с SQLite закрыто

Примечание: после соединения с SQLite все содержимое файла сохраняется в переменной. Затем используется команда cursor.executescript(script) для выполнения всех инструкций за раз.

Исключения базы данных SQLite

  • sqlite3.Warning . Подкласс Exception . Его можно игнорировать, если нужно, чтобы оно не останавливало выполнение.
  • sqlite3.Error . Базовый класс для остальных исключений модуля sqlite3. Подкласс Exception .
  • sqlite3.DatabaseError . Исключение, которое возвращается при ошибках базы данных. Например, если попытаться открыть файл как базу sqite3, хотя он ею не является, то вернется ошибка «sqlite3.DatabaseError: file is encrypted or is not a database».
  • sqlite3.IntegrityError . Подкласс DatabaseError . Эта ошибка возвращается, когда затрагиваются отношения в базе, например, например, не проходит проверка внешнего ключа.
  • sqlite3.ProgrammingError . Подкласс DatabaseError . Эта ошибка возникает из-за ошибок программиста: создание таблицы с именем, которое уже занято, синтаксическая ошибка в SQL-запросах.
  • sqlite3.OperationalError . Подкласс DatabaseError . Эту ошибку невозможно контролировать. Она появляется в ситуациях, которые касаются работы базы данных, например, обрыв соединения, неработающий сервер, проблемы с источником данных и так далее.
  • sqlite3.NotSupportedError . Это исключение появляется при попытке использовать неподдерживаемое базой данных API. Пример: вызов метода rollback() для соединения, которое не поддерживает транзакции. Вызов коммита после команды создания таблицы.

Таким образом рекомендуется всегда писать код управления базой данных в блоке try, чтобы была возможность перехватывать исключения и предпринимать действия, которые помогут справиться с ними.

Например, попробуем добавить данные в таблицу, которой не существует и выведем весь стек исключений из Python.

 
import sqlite3
import traceback
import sys

try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("База данных подключена к SQLite")

sqlite_insert_query = """INSERT INTO unknown_table_1
(id, text) VALUES (1, 'Демо текст')"""

count = cursor.execute(sqlite_insert_query)
sqlite_connection.commit()
print("Запись успешно вставлена ​​в таблицу sqlitedb_developers ", cursor.rowcount)
cursor.close()

except sqlite3.Error as error:
print("Не удалось вставить данные в таблицу sqlite")
print("Класс исключения: ", error.__class__)
print("Исключение", error.args)
print("Печать подробноcтей исключения SQLite: ")
exc_type, exc_value, exc_tb = sys.exc_info()
print(traceback.format_exception(exc_type, exc_value, exc_tb))
finally:
if (sqlite_connection):
sqlite_connection.close()
print("Соединение с SQLite закрыто")
База данных подключена к SQLite Не удалось вставить данные в таблицу sqlite Класс исключения: Исключение ('no such table: unknown_table_1',) Печать подробноcтей исключения SQLite: ['Traceback (most recent call last):\n', ' File "C:\\Users\\demo\\AppData\\Local\\Programs\\Python\\Python38\\sqlitet.py", line 13, in \n count = cursor.execute(sqlite_insert_query)\n', 'sqlite3.OperationalError: no such table: unknown_table_1\n'] Соединение с SQLite закрыто

Изменения timeout при подключении из Python

Бывает такое, что есть несколько подключений к базе данных SQLite, и одно из них выполняет определенное изменение. Для этого соединению требуется выполнить блокировку — база данных блокируется до тех пор, пока транзакция не будет завершена.

Параметр timeout, который задается при подключении, определяет, как долго соединение будет ожидать отключения блокировки перед возвращением исключения.

По умолчанию значение этого параметра равно 5.0 (5 секунд). Его не нужно задавать, потому что это значение по умолчанию. Таким образом при подключении к базе данных из Python, если ответ не будет получен в течение 5 секунд, вернется исключение. Однако параметр все-таки можно задать в функции sqlite3.connect .

Посмотрим, как это сделать из Python.

 
import sqlite3

def read_sqlite_table():
try:
sqlite_connection= sqlite3.connect('sqlite_python.db', timeout=20)
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")

sqlite_select_query = """SELECT count(*) from sqlitedb_developers"""
cursor.execute(sqlite_select_query)
total_rows = cursor.fetchone()
print("Всего строк: ", total_rows)
cursor.close()

except sqlite3.Error as error:
print("Ошибка при подключении к sqlite", error)
finally:
if (sqlite_connection):
sqlite_connection.close()
print("Соединение с SQLite закрыто")

read_sqlite_table()
Подключен к SQLite Всего строк: (0,) Соединение с SQLite закрыто

Получение изменений с момента подключения к базе данных

Для статистики может потребоваться найти количество строк базы данных, которые были вставлены, удалены или изменены с момента открытия соединения. Для этого используется функция connection.total_changes модуля sqlite3.

Этот метод возвращается общее количество строк, которые были затронуты. Рассмотрим пример.

 
import sqlite3

try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")

sqlite_insert_query = """INSERT INTO sqlitedb_developers
(id, name, email, joining_date, salary)
VALUES (4, 'Alex', 'sale@gmail.com', '2020-11-20', 8600);"""
cursor.execute(sqlite_insert_query)

sql_update_query = """Update sqlitedb_developers set salary = 10000 where /> cursor.execute(sql_update_query)

sql_delete_query = """DELETE from sqlitedb_developers where /> cursor.execute(sql_delete_query)

sqlite_connection.commit()
cursor.close()

except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if (sqlite_connection):
print("Всего строк, измененных после подключения к базе данных: ", sqlite_connection.total_changes)
sqlite_connection.close()
print("Соединение с SQLite закрыто")
Подключен к SQLite Всего строк, измененных после подключения к базе данных: 3 Соединение с SQLite закрыто

Сохранение резервной копии базы данных из Python

Модуль sqlite3 в Python предоставляет функцию для сохранения резервной копии базы данных SQLite. С помощью метода connection.backup() можно сделать резервную копию базы SQLite.

connection.backup(target, *, pages=0, progress=None, name="main", sleep=0.250)

Эта функция делает полную резервную копию базы данных SQLite. Изменения записываются в аргумент target , который должен быть экземпляром другого соединения.

По умолчанию когда параметр pages равен 0 или отрицательному числу, вся база данных копируется в один шаг. В противном случае метод выполняет цикл, копируя заданное количество страниц за раз.

Аргумент name определяет базу данных, резервную копию которой нужно сделать. Аргумент sleep — количество секунд между последовательными попытками сохранить оставшиеся страницы. Аргумент sleep можно задать как в качестве целого числа, так и в виде числа с плавающей точкой.

Рассмотрим один пример копирования базы данных в другую.

 
import sqlite3

def progress(status, remaining, total):
print(f'Скопировано из . ')

try:
sqlite_con = sqlite3.connect('sqlite_python.db')
backup_con = sqlite3.connect('sqlite_backup.db')
with backup_con:
sqlite_con.backup(backup_con, pages=3, progress=progress)
print("Резервное копирование выполнено успешно")
except sqlite3.Error as error:
print("Ошибка при резервном копировании: ", error)
finally:
if(backup_con):
backup_con.close()
sqlite_con.close()
Скопировано 3 из 5. Скопировано 5 из 5. Резервное копирование выполнено успешно
  • После подключения к SQLite обе базы данных были открыты с помощью двух разных подключений
  • Дальше выполняется метод connection.backup() с помощью экземпляра первого подключения. Также задано количество страниц, которые нужно скопировать за одну итерацию.

How can I add the sqlite3 module to Python?

Can someone tell me how to install the sqlite3 module alongside the most recent version of Python? I am using a Macbook, and on the command line, I tried:

pip install sqlite 

but an error pops up.
2,708 4 4 gold badges 32 32 silver badges 43 43 bronze badges
asked Oct 23, 2013 at 1:01
Jin-Dominique Jin-Dominique
3,083 6 6 gold badges 20 20 silver badges 28 28 bronze badges

If your python is built from source manually , and meet this error, you should install sqlite-devel package first, then rebuild python, as @falsetru said, the package name will be vary depending on the Operating system.

Mar 28, 2016 at 1:54

For everone trying to build python from source and running into this error: This really good answer adresses the bulild process and the dependencys you need. stackoverflow.com/a/6171511/6273503

Sep 28, 2017 at 8:35

7 Answers 7

You don't need to install sqlite3 module. It is included in the standard library (since Python 2.5).

answered Oct 23, 2013 at 1:03
359k 63 63 gold badges 736 736 silver badges 638 638 bronze badges
I actually have a python 2.5.4 that does not included sqlite3 🙁
Jul 4, 2014 at 13:13

@user722915, According to What's New in Python 2.5, The pysqlite module (pysqlite.org), a wrapper for the SQLite embedded database, has been added to the standard library under the package name sqlite3.

Jul 4, 2014 at 13:16

if your python3 is built from source manually , and meet this error, you should install sqlite-devel package first, then rebuild python3.

Mar 28, 2016 at 1:28

@ngn999, BTW, the package name will be vary depending on the Operating system. For example, in Ubuntu, it's libsqlite3-dev .

Mar 28, 2016 at 1:50
LITERALLY LIFED MY SAVE!
Dec 8, 2020 at 2:59

For Python version 3:

pip install pysqlite3 

13.8k 9 9 gold badges 66 66 silver badges 108 108 bronze badges
answered Jun 25, 2018 at 20:06
941 6 6 silver badges 3 3 bronze badges

pysqlite3 is just a wrapper. It won't work if you don't actually have the SQLite libraries in your system (or the devel package if you built Python from sources).

Sep 4, 2021 at 20:44

I tried this and it installed, but I still couldn't use it. Any ideas? Here's what it says when I run the command: Preparing metadata (setup.py) . done Using legacy 'setup.py install' for pysqlite3, since package 'wheel' is not installed. Installing collected packages: pysqlite3 Running setup.py install for pysqlite3 . done Successfully installed pysqlite3

Mar 28, 2022 at 14:19

I have python 2.7.3 and this solved my problem:

pip install pysqlite 

answered Mar 10, 2015 at 9:06
nicolimo86 nicolimo86
718 11 11 silver badges 22 22 bronze badges
Consider that this is not applicable to Python 3.
Dec 12, 2016 at 19:32

Normally, it is included. However, as @ngn999 said, if your python has been built from source manually, you'll have to add it.

Here is an example of a script that will setup an encapsulated version (virtual environment) of Python3 in your user directory with an encapsulated version of sqlite3.

INSTALL_BASE_PATH="$HOME/local" cd ~ mkdir build cd build [ -f Python-3.6.2.tgz ] || wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz tar -zxvf Python-3.6.2.tgz [ -f sqlite-autoconf-3240000.tar.gz ] || wget https://www.sqlite.org/2018/sqlite-autoconf-3240000.tar.gz tar -zxvf sqlite-autoconf-3240000.tar.gz cd sqlite-autoconf-3240000 ./configure --prefix=$ make make install cd ../Python-3.6.2 LD_RUN_PATH=$/lib configure LDFLAGS="-L $/lib" CPPFLAGS="-I $/include" LD_RUN_PATH=$/lib make ./configure --prefix=$ make make install cd ~ LINE_TO_ADD="export PATH=$/bin:\$PATH" if grep -q -v "$" $HOME/.bash_profile; then echo "$" >> $HOME/.bash_profile; fi source $HOME/.bash_profile 

Why do this? You might want a modular python environment that you can completely destroy and rebuild without affecting your managed package installation. This would give you an independent development environment. In this case, the solution is to install sqlite3 modularly too.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *