Query sqlite from python

Получение данных из таблицы 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 закрыто

Источник

Читайте также:  Sql bigint java type
Оцените статью