Изменение данных¶
Как мы выяснили по умолчанию метод 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)
obj = points.filter(id=1)
print(f'{obj.position=}')
print(f'{obj.color=}')
print(f'{obj.size=}')
Не выделенный код мы взяли из пред идущей темы. Дальше мы будем опускать его.
Если мы можем к ним обращаться, давайте попробуем изменить их.
obj = points.filter(id=1)
obj.color = 'green'
Изменить значение поля у нас получилось. Но в базе данных это изменение не сохраниться.
В Sqlite3 API есть 2 метода для изменений значений:
save
и update
. Давайте познакомимся с ними.
Метод save()¶
Метод, сохраняющий изменения полей объекта в таблицу.
Метод не принимает параметры.
obj = points.filter(id=1)
obj.color = 'green'
obj.size += 5
obj.save()
После выполнения данного кода первая точка в таблице
изменит значение полей color
и size
,
так же все эти изменения сохраняться в базе данных.
Этот метод изменения данных можно применять, если необходимо изменять объект на протяжении долгого времени и только в конце сохранить оставшееся в итоге.
Метод update()¶
Метод, изменяющий объект и сохраняющий эти изменения.
В качестве параметров принимает поля,
которые необходимо изменить, и их значения.
obj = points.filter(id=1)
obj.update(color='green', size=obj.size + 5)
Данный код изменит объект так же, как и код,
который приведён в разделе про метод save
.
Этот метод подходит в тех случаях, когда у нас нет необходимости долгое время работать с объектом. Например мы можем использовать его так:
points.filter(id=2).update(color='white')
Пример¶
Поработаем с нашими точками.
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)
first_point = points.filter(id=1)
first_point.position.x -= 4
first_point.position.y = 0
points.filter(id=2).update(size=first_point.size + 1)
third_point = points.filter(id=3)
third_point.update(size=first_point.size + 1, color='blue')
first_point.color = third_point.color
blue_points = points.filter(return_list=True, color='blue')
for point in blue_points:
first_point.size += point.size
first_point.save()
# Посмотрим на изменения
for obj in points.filter():
print(obj, '\n')
Не забывайте
При изменении полей, указывайте данные того же типа, что и при описании таблицы.
first_point = points.filter(id=1)
first_point.position = Position(0, 0)
first_point.save()