В этой главе мы увидим, как изменить или обновить таблицу с требуемыми значениями.
Чтобы изменить данные определенного атрибута любого объекта, мы должны присвоить ему новое значение и зафиксировать изменения, чтобы сделать это изменение постоянным.
Давайте извлечем объект из таблицы, чей идентификатор первичного ключа, в нашей таблице Customers с ID = 2. Мы можем использовать метод get () сессии следующим образом:
x = session.query(Customers).get(2)
Мы можем отобразить содержимое выбранного объекта с помощью приведенного ниже кода —
print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)
Из таблицы наших клиентов должен отображаться следующий результат:
Name: Komal Pande Address: Koti, Hyderabad Email: [email protected]
Теперь нам нужно обновить поле Address, назначив новое значение, как указано ниже —
x.address = 'Banjara Hills Secunderabad' session.commit()
Изменение будет постоянно отражаться в базе данных. Теперь мы извлекаем объект, соответствующий первой строке таблицы, используя метод first () следующим образом:
x = session.query(Customers).first()
Это выполнит следующее выражение SQL —
SELECT customers.id AS customers_id, customers.name AS customers_name, customers.address AS customers_address, customers.email AS customers_email FROM customers LIMIT ? OFFSET ?
Связанные параметры будут LIMIT = 1 и OFFSET = 0 соответственно, что означает, что будет выбран первый ряд.
print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)
Теперь вывод для вышеуказанного кода, отображающего первую строку, выглядит следующим образом:
Name: Ravi Kumar Address: Station Road Nanded Email: [email protected]
Теперь измените атрибут name и отобразите содержимое, используя приведенный ниже код —
x.name = 'Ravi Shrivastava' print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)
Вывод вышеуказанного кода —
Name: Ravi Shrivastava Address: Station Road Nanded Email: [email protected]
Даже если изменение отображается, оно не зафиксировано. Вы можете сохранить прежнюю постоянную позицию, используя метод rollback () с кодом ниже.
session.rollback() print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)
Оригинальное содержание первой записи будет отображаться.
Для массовых обновлений мы будем использовать метод update () объекта Query. Давайте попробуем дать префикс «мистер» имя в каждой строке (кроме ID = 2). Соответствующий оператор update () выглядит следующим образом:
session.query(Customers).filter(Customers.id! = 2). update({Customers.name:"Mr."+Customers.name}, synchronize_session = False)
Метод update () требует два параметра следующим образом:
-
Словарь значений ключей с ключом, являющимся атрибутом, подлежащим обновлению, и значением, являющимся новым содержимым атрибута.
-
Атрибут synchronize_session с описанием стратегии обновления атрибутов в сеансе. Допустимые значения: false: для отсутствия синхронизации сеанса fetch: выполняет запрос на выборку перед обновлением, чтобы найти объекты, которые соответствуют запросу на обновление; и оценивать: оценивать критерии по объектам в сеансе.
Словарь значений ключей с ключом, являющимся атрибутом, подлежащим обновлению, и значением, являющимся новым содержимым атрибута.
Атрибут synchronize_session с описанием стратегии обновления атрибутов в сеансе. Допустимые значения: false: для отсутствия синхронизации сеанса fetch: выполняет запрос на выборку перед обновлением, чтобы найти объекты, которые соответствуют запросу на обновление; и оценивать: оценивать критерии по объектам в сеансе.
Три из четырех строк в таблице будут иметь имя с префиксом «Мистер» Однако изменения не зафиксированы и, следовательно, не будут отражены в табличном представлении SQLiteStudio. Он будет обновляться только тогда, когда мы фиксируем сессию.