В этом материале речь пойдет о команде 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]
.
Разбор примера
import sqlite3
:
- Эта строка импортирует в программу модуль 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 id = "ID из программы")
Рассмотрим пример.
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 id = ?"""
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 id = ?"""
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 закрыто