Учебники

SQLAlchemy ORM — Обновление объектов

В этой главе мы увидим, как изменить или обновить таблицу с требуемыми значениями.

Чтобы изменить данные определенного атрибута любого объекта, мы должны присвоить ему новое значение и зафиксировать изменения, чтобы сделать это изменение постоянным.

Давайте извлечем объект из таблицы, чей идентификатор первичного ключа, в нашей таблице 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: komal@gmail.com

Теперь нам нужно обновить поле 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: ravi@gmail.com

Теперь измените атрибут name и отобразите содержимое, используя приведенный ниже код —

x.name = 'Ravi Shrivastava'
print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)

Вывод вышеуказанного кода —

Name: Ravi Shrivastava Address: Station Road Nanded Email: ravi@gmail.com

Даже если изменение отображается, оно не зафиксировано. Вы можете сохранить прежнюю постоянную позицию, используя метод 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. Он будет обновляться только тогда, когда мы фиксируем сессию.