Чтение данных¶
Хорошо что мы научились добавлять записи в таблицу,
но как нам узнать что мы туда сохранили? В этом нам поможет метод filter()
.
Посмотрим как он работает и обобщим его функционал в конце.
Вывод всех записей¶
Напишем код, который выведет все записи в таблице.
from data_base import Points, Position
points = Points(db_path=':memory:')
points.create_table()
points.insert(position=Position(4, 5.5))
points.insert(position=Position(5, 6.5))
points.insert(position=Position(0, 0), color='red')
points.insert(position=Position(-1, 1.2), size=2)
points.insert(position=Position(2, -2), color='blue', size=3)
data = points.filter()
for obj in data:
print(obj, '\n')
Именно выделенный код отвечает за получение и вывод всех записей из таблицы. Остальной код мы взяли из пред идущего раздела о добавлении данных. (В следующих примерах мы будем опускать эту часть кода)
Фильтрация¶
У нас получилось вывести все записи, но давайте научимся их фильтровать.
Попробуем вывести только черные точки.
for obj in points.filter(color='black'):
print(obj, '\n')
Это оказалось не так уж сложно.
Постфиксы¶
Ну а что если мы захотим вывести все точки кроме черных?
Мы ведь не можем написать filter(color!='black')
.
В Sqlite3 API это реализовано с помощью постфиксов.
Например для решения поставленной нами задачи используется постфикс no
.
Вот как это выглядит:
for obj in points.filter(color_no='black'):
print(obj, '\n')
Мы просто добавили нужный нам постфикс к названию поля, разделяя их нижним подчеркиванием.
Примечание
Наш код не сломается, даже есть в названии поля уже присутствует нижнее подчеркивание.
filter(first_filed_no=val)
В Sqlite3 API реализовано несколько постфиксов:
Постфикс | gt | lt | no | egt | elt |
---|---|---|---|---|---|
Расшифровка | > | < | != | >= | <= |
Примеры использования постфиксов
Давайте выведем все не черные точки размер которых меньше двух.
for obj in points.filter(color_no='black', size_lt=2, return_list=True):
print(obj, '\n')
Выведем точки которые находятся на нулевых координатах.
for obj in points.filter(position=Position(0, 0), return_list=True):
print(obj, '\n')
Параметр return_list¶
Факт: Метод filter
может вернуть объект, а может список объектов
в зависимости от их количества полученного при фильтрации.
Поэтому все наши пред идущие примеры могут вызывать исключения.
Что бы такого не было нам поможет аргумент return_list
.
Если указать для него значение True
, то метод filter
будет возвращать список,
даже если в таблице нет записей подходящих условию.
К примеру получим список точек размер которых равен 2.
for obj in points.filter(return_list=True, size=2):
print(obj, '\n')
Что если бы мы не указали return_list
for obj in points.filter(size=2):
print(obj, '\n')
Данный код вызовет исключение TypeError
Параметр return_type¶
Этот параметр может принимать 2 значения:
classes
или visual
classes¶
По умолчанию параметр return_type
принимает именно это значение.
Это означает что метод filter
возвращает объекты нашего описания.
Проведём эксперимент
Запустим такой код:
for obj in points.filter():
print(type(obj))
На каждой строке будет выведено чтото похожее на это: <class 'data_base.Points'>
.
Это означает что для каждого obj
верно утверждение isinstance(obj, Points)
visual¶
Если указать это значение, то метод filter
вернёт обычный массив данных,
как это делает fetchall
из модуля sqlite3.
Проведём эксперимент
Запустим такой код:
for obj in points.filter(return_type='visual'):
print(type(obj))
Код будет выводить <class 'tuple'>
.
Метод filter()¶
Метод, возвращающий записи из таблицы,
подходящие определённым условиям.
Имеет 2 параметра по умолчанию, это return_list
и return_type
.
Так же может принимать параметры фильтрации.
Пример фильтрации записей
conditions = dict(first_filed_no=1, second_filed=1)
data = table.filter(return_list=True, **conditions)