Получение данных из таблицы SQLite
В этом материале речь пойдет о команде SELECT для получения данных из таблицы SQLite в приложении Python. Вы узнаете, как доставать строки с данными благодаря встроенному модулю sqlite3.
- Получать все строки с помощью с помощью cursor.fetchall() .
- Использовать cursor.fetchmany(size) для получения ограниченного количества строк, а также cursor.fetchone() — для одной.
- Использовать переменные Python в запросе SQLite для передачи динамических данных.
Подготовка
Перед работой с этой Python-программой нужно убедиться, что вы знаете название и подробности о колонках той SQLite-таблицы, с которой предстоит работать.
В этом примере будет использоваться таблица sqlitedb_developers . Она была создана в первой части руководства по sqlite3 и заполнена во второй.
Шаги для получения строк из таблицы SQLite
Для выполнения операции SELECT из Python нужно выполнить следующие шаги:
- Установить соединение с базой данных SQLite из Python;
- Создать запрос с инструкцией SELECT для SQLite. Именно на этом этапе понадобятся знания названия таблицы и подробностей о колонках;
- Выполнить SELECT-запрос с помощью метода cursor.execute()
- Получить строки с помощью объекта Cursor и метода cursor.fetchall() ;
- Перебрать строки и получить для каждой ее соответствующее значение;
- Закрыть объект Cursor и соединение с базой данных SQLite;
- Перехватить любые исключения, которые могут возникнуть в процессе работы.
Пример программы на Python для получения всех строк из таблицы sqlitedb_developers .
import sqlite3
def read_sqlite_table(records):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_select_query = """SELECT * from sqlitedb_developers"""
cursor.execute(sqlite_select_query)
records = cursor.fetchall()
print("Всего строк: ", len(records))
print("Вывод каждой строки")
for row in records:
print("ID:", row[0])
print("Имя:", row[1])
print("Почта:", row[2])
print("Добавлен:", row[3])
print("Зарплата:", row[4], end="\n\n")
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
read_sqlite_table()Подключен к SQLite Всего строк: 6 Вывод каждой строки ID: 1 Имя: Oleg Почта: oleg04@gmail.com Добавлен: 2020-11-29 Зарплата: 8100.0 . ID: 6 Имя: Nikita Почта: aqillysso@gmail.com Добавлен: 2020-11-27 Зарплата: 7400.0 Соединение с SQLite закрыто
В этом примере прямо отображаются строка и значение ее колонки. Если вам нужно использовать значения колонки в своей программе, то их можно сохранять в переменные Python. Для этого нужно написать, например, так: name = row[1] .
Разбор примера
- Эта строка импортирует в программу модуль sqlite3.
- С помощью классов и методов из этого модуля можно прямо взаимодействовать с базой данных.
sqlite3.connect() и connection.cursor() :
- С помощью sqlite3.connect() устанавливается соединение с базой данных SQLite из Python.
- После этого готовится SELECT-запрос для получения всех строк из таблицы sqlitedb_developers . Она содержит пять колонок.
- Метод connection.cursor() используется для получения объекта Cursor из объекта соединения.
cursor.execute() и cursor.fetchall() :
- Выполняется SELECT-операция с помощью метода execute() объекта Cursor .
- После успешного выполнения запроса используется метод cursor.fetchall() для получения всех записей таблицы sqlitedb_developers .
- В конце используется цикл для перебора всех записей и вывода их по одному.
После того как все записи были получены, объект Cursor закрывается с помощью cursor.close() , а соединение с базой данных — с помощью sqliteConnection.close() .
- Используйте cursor.execute() для выполнения запроса.
- cursor.fetchall() — получение всех строк.
- cursor.fetchone() — для одной строки.
- cursor.fetchmany(SIZE) — для ограниченного количества строк.
Использование переменных в качестве параметров Select-запроса
Часто есть необходимость передать переменную в SELECT-запрос для проверки определенного условия.
Предположим, приложение хочет сделать запрос для получения информации о разработчиках, используя их id. Для этого необходим запрос с параметрами. Это такой запрос, где внутри используются заполнители (?) на месте параметров, которые потом заменяются реальными значениями.
cursor.execute("SELECT salary FROM sqlitedb_developers WHERE )
import sqlite3
def get_developer_info(id):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sql_select_query = """select * from sqlitedb_developers where /> cursor.execute(sql_select_query, (id,))
records = cursor.fetchall()
print("Вывод ID ", id)
for row in records:
print("ID:", row[0])
print("Имя:", row[1])
print("Почта:", row[2])
print("Добавлен:", row[3])
print("Зарплата:", row[4], end="\n\n")
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
get_developer_info(2)Подключен к SQLite Вывод ID 2 ID: 2 Имя: Viktoria Почта: s_dom34@gmail.com Добавлен: 2020-11-19 Зарплата: 6000.0 Соединение с SQLite закрыто
Получение нескольких строк из таблицы
В некоторых случаев попытка получить все строки из таблицы займет слишком много времени, особенно, если их там тысячи.
Для получения всех строк нужно больше ресурсов: памяти и времени обработки. А для улучшения производительности в таких случаях рекомендуется использовать метод fetchmany(size) класса сursor для получения фиксированного количество строк.
С помощью cursor.fetchmany(size) можно указать, сколько строк требуется прочесть. Рассмотрим на примере:
import sqlite3
def read_limited_rows(row_size):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_select_query = """SELECT * from sqlitedb_developers"""
cursor.execute(sqlite_select_query)
print("Чтение ", row_size, " строк")
records = cursor.fetchmany(row_size)
print("Вывод каждой строки \n")
for row in records:
print("ID:", row[0])
print("Имя:", row[1])
print("Почта:", row[2])
print("Добавлен:", row[3])
print("Зарплата:", row[4], end="\n\n")
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
read_limited_rows(2)Подключен к SQLite Чтение 2 строк Вывод каждой строки ID: 1 Имя: Oleg Почта: oleg04@gmail.com Добавлен: 2020-11-29 Зарплата: 8100.0 ID: 2 Имя: Viktoria Почта: s_dom34@gmail.com Добавлен: 2020-11-19 Зарплата: 6000.0 Соединение с SQLite закрыто
Примечание: в этой программе был сделан запрос на получение двух записей. Но если в таблице их меньше, то вернется именно такое количество.
Получение одной строки из таблицы
Когда нужно получить одну строку из таблицы SQLite, стоит использовать метод fetchone() класса cursor . Этот метод необходим в тех случаях, когда известно, что запрос вернет одну строку.
cursor.fetchone() получает только следующую строку из результата. Если же строк нет, то возвращается None . Пример:
import sqlite3
def read_single_row(developer_id):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_select_query = """SELECT * from sqlitedb_developers where /> cursor.execute(sqlite_select_query, (developer_id, ))
print("Чтение одной строки \n")
record = cursor.fetchone()
print("ID:", record[0])
print("Имя:", record[1])
print("Почта:", record[2])
print("Добавлен:", record[3])
print("Зарплата:", record[4])
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
read_single_row(3)Подключен к SQLite Чтение одной строки ID: 3 Имя: Valentin Почта: exp3@gmail.com Добавлен: 2020-11-23 Зарплата: 6500.0 Соединение с SQLite закрыто