SQLite – это встроенная, легковесная база данных, не требующая отдельного сервера. Она входит в стандартную библиотеку Python, что позволяет начать работу без установки сторонних зависимостей. Модуль sqlite3 предоставляет все необходимые инструменты для создания, чтения и управления базами данных формата SQLite прямо из Python-кода.
Чтобы подключиться к базе данных, достаточно вызвать sqlite3.connect(«имя_файла.db»). Если файл с базой данных не существует, он будет создан автоматически. Соединение возвращает объект Connection, через который можно выполнять SQL-запросы с помощью метода cursor(). Этот метод создаёт объект Cursor, который используется для выполнения инструкций SQL, таких как CREATE TABLE, INSERT, SELECT и других.
Важно помнить, что все изменения данных должны быть зафиксированы вызовом commit(), иначе они не сохранятся. Например, после добавления новой строки с помощью INSERT INTO необходимо вызвать conn.commit(). Для чтения данных используется метод fetchall() или fetchone(), в зависимости от того, сколько строк требуется получить.
По завершении работы соединение следует закрыть с помощью conn.close(). Это освобождает ресурсы и завершает транзакции. При работе с SQLite также важно использовать параметры подстановки (?) вместо прямой вставки значений в SQL-запросы – это защищает от SQL-инъекций и упрощает форматирование запросов.
Установка и импорт модуля sqlite3 в Python
Модуль sqlite3
входит в стандартную библиотеку Python, начиная с версии 2.5. Дополнительная установка не требуется, если используется официальная сборка Python от python.org.
Проверьте наличие модуля командой:
python -c "import sqlite3; print(sqlite3.version)"
- Откройте официальный сайт.
- Скачайте версию Python 3.7 или выше.
- Установите с опцией «Add Python to PATH».
Для начала работы с SQLite импортируйте модуль:
import sqlite3
Рекомендуется сразу установить соединение с базой данных для проверки:
conn = sqlite3.connect("example.db")
Если файл example.db
отсутствует, он будет создан автоматически в текущей директории. Для временной базы используйте:
conn = sqlite3.connect(":memory:")
После подключения важно создать объект курсора:
cursor = conn.cursor()
Работа с модулем возможна без сторонних зависимостей. Убедитесь, что используется стабильная версия Python и права доступа к директории не ограничены.
Создание новой базы данных и подключение к ней
Для создания новой базы данных SQLite достаточно указать имя файла при подключении через модуль sqlite3
. Если файл не существует, он будет создан автоматически.
import sqlite3
connection = sqlite3.connect("example.db")
Файл example.db
появится в текущем каталоге. Расширение может быть любым, но чаще используют .db
или .sqlite3
.
- Если указать абсолютный путь, база будет создана в конкретном месте:
sqlite3.connect("/path/to/database/data.sqlite3")
- Для временной базы в памяти укажите специальное имя:
sqlite3.connect(":memory:")
Подключение возвращает объект Connection
. Его следует закрыть после использования:
connection.close()
Рекомендуется использовать менеджер контекста, чтобы исключить утечки ресурсов:
with sqlite3.connect("example.db") as conn:
# операции с базой данных
pass
При первом подключении база пустая. Таблицы создаются вручную через SQL-запросы:
with sqlite3.connect("example.db") as conn:
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
)
""")
conn.commit()
Рекомендации:
- Используйте
CREATE TABLE IF NOT EXISTS
, чтобы избежать ошибок при повторном запуске. - Сохраняйте изменения вызовом
commit()
, иначе данные не попадут в файл. - Открывайте соединение только на время выполнения операций. Держать его открытым постоянно – плохая практика.
Создание таблиц с помощью SQL-запросов из Python
Для создания таблицы в SQLite используется метод execute()
объекта курсора. Предварительно необходимо установить соединение с базой данных с помощью sqlite3.connect()
. Если файл базы отсутствует, он будет создан автоматически.
Пример: создание таблицы users
с полями id
, username
, email
и created_at
:
import sqlite3
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
conn.close()
Инструкция IF NOT EXISTS
предотвращает попытку повторного создания таблицы, если она уже существует. Для автоматической генерации идентификаторов используется AUTOINCREMENT
в сочетании с INTEGER PRIMARY KEY
.
Поле username
ограничено уникальностью с помощью UNIQUE
, что обеспечивает защиту от дублирующих записей. Поле created_at
автоматически заполняется текущей датой и временем при вставке записи благодаря DEFAULT CURRENT_TIMESTAMP
.
После выполнения запроса всегда вызывайте commit()
, чтобы сохранить изменения, и close()
для закрытия соединения. Рекомендуется использовать блок with
для автоматического управления ресурсами.
Добавление данных в таблицу через Python-скрипт
Для вставки данных в таблицу SQLite используется метод execute() объекта курсора с параметризированным SQL-запросом. Это позволяет избежать SQL-инъекций и обеспечить корректную обработку данных.
Пример: пусть существует таблица users с полями id, name, email.
import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute(
"INSERT INTO users (name, email) VALUES (?, ?)",
("Иван Петров", "ivan@example.com")
)
conn.commit()
conn.close()
Важно использовать placeholders (?, ?), а не форматирование строк, чтобы избежать подстановки вредоносного кода. Перед вставкой убедитесь, что соединение открыто, а структура таблицы соответствует передаваемым данным.
Если необходимо добавить несколько записей, используйте executemany():
users = [
("Анна Смирнова", "anna@example.com"),
("Павел Орлов", "pavel@example.com")
]
cursor.executemany(
"INSERT INTO users (name, email) VALUES (?, ?)",
users
)
После всех операций обязательно вызывайте conn.commit() для сохранения изменений и conn.close() для освобождения ресурсов.
Чтение данных из базы с использованием SELECT
Для извлечения данных из SQLite используйте метод execute() объекта курсора с SQL-запросом SELECT. После выполнения запроса применяйте fetchone(), fetchall() или fetchmany(size) в зависимости от объёма ожидаемых данных.
Пример чтения всех строк из таблицы users:
import sqlite3
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("SELECT id, name, email FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)
conn.close()
Если требуется выборка с фильтрацией, используйте параметры запроса:
cursor.execute("SELECT name FROM users WHERE id = ?", (1,))
user = cursor.fetchone()
print(user[0])
Параметры передавайте через кортеж, чтобы избежать SQL-инъекций. Не вставляйте значения напрямую в строку запроса.
Для перебора большого количества строк используйте итерацию по курсору без предварительного вызова fetchall():
for row in cursor.execute("SELECT * FROM users"):
print(row)
Это снижает потребление памяти при работе с крупными таблицами.
Работая с именованными столбцами, установите row_factory:
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
row = cursor.fetchone()
print(row["name"])
Это позволяет обращаться к данным по имени столбца, а не по индексу, повышая читаемость кода.
Обновление и удаление записей в базе данных
Для обновления данных в SQLite используется SQL-запрос UPDATE
. Он позволяет изменить существующие записи в таблице. Важно всегда указать условие с помощью WHERE
, чтобы избежать изменения всех строк таблицы. Пример обновления записи по ID:
import sqlite3
connection = sqlite3.connect('database.db')
cursor = connection.cursor()
# Обновление записи по ID
cursor.execute("UPDATE users SET name = ? WHERE id = ?", ('Иван', 1))
connection.commit()
cursor.close()
connection.close()
После выполнения запроса важно вызвать commit()
, чтобы изменения вступили в силу. Если этого не сделать, изменения не сохранятся в базе данных.
Для удаления записей используется запрос DELETE
. Он позволяет удалить одну или несколько строк. Как и в случае с UPDATE
, без указания условия WHERE
будет удалена вся таблица. Пример удаления записи:
connection = sqlite3.connect('database.db')
cursor = connection.cursor()
# Удаление записи по ID
cursor.execute("DELETE FROM users WHERE id = ?", (1,))
connection.commit()
cursor.close()
connection.close()
Перед выполнением удаления всегда проверяйте условия, чтобы избежать потери данных. В некоторых случаях полезно сначала выполнить запрос с SELECT
, чтобы удостовериться в корректности условий.
Закрытие соединения и обработка ошибок при работе с SQLite
После завершения работы с базой данных важно закрыть соединение с SQLite, чтобы освободить ресурсы. Это можно сделать с помощью метода close()
объекта соединения. Закрытие соединения предотвращает утечки памяти и освобождает ресурсы системы.
Пример кода для закрытия соединения:
import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# Работа с базой данных
conn.close()
Если не закрывать соединение, это может привести к перегрузке системы и потере данных, особенно при длительных сессиях. Рекомендуется использовать блок try...finally
, чтобы гарантировать закрытие соединения, даже если возникает ошибка в процессе работы с базой данных.
Пример с использованием try...finally
:
try:
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# Операции с базой данных
finally:
conn.close()
Ошибка при работе с SQLite может быть связана с множеством факторов, включая неверные SQL-запросы, нарушение целостности данных или проблемы с подключением. Для их обработки в Python используется механизм исключений. Все ошибки SQLite представлены в виде объектов класса sqlite3.DatabaseError
и его производных.
Для перехвата и обработки ошибок используется конструкция try...except
. Например, при выполнении некорректного SQL-запроса можно поймать исключение и вывести ошибку:
try:
cursor.execute("SELECT * FROM non_existent_table")
except sqlite3.DatabaseError as e:
print(f"Ошибка базы данных: {e}")
Кроме того, можно использовать более специфичные исключения, такие как sqlite3.OperationalError
, чтобы точно обрабатывать конкретные ошибки, например, проблемы с доступом к базе данных или синтаксические ошибки в запросах.
Важно помнить, что все ошибки не следует обрабатывать одинаково. Ошибки, требующие вмешательства пользователя, такие как синтаксические ошибки в запросах, должны быть отображены в понятном виде. Ошибки, связанные с доступом к файлу базы данных или с нарушением целостности, могут требовать более серьезных действий, таких как восстановление данных или сообщение об ошибке администратору.