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: [email protected]

Теперь нам нужно обновить поле адреса, присвоив новое значение, как указано ниже -

x.address = 'Banjara Hills Secunderabad'
session.commit()

Изменение будет постоянно отражаться в базе данных. Теперь мы получаем объект, соответствующий первой строке в таблице, используяfirst() method следующим образом -

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]

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

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() method с кодом ниже.

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)

The update() method requires two parameters as follows −

  • Словарь ключей и значений, в котором ключ является атрибутом, который необходимо обновить, а значение - новым содержимым атрибута.

  • Атрибут synchronize_session, указывающий на стратегию обновления атрибутов в сеансе. Допустимые значения - false: если сеанс не синхронизируется, fetch: выполняет запрос выбора перед обновлением, чтобы найти объекты, которые совпадают с запросом обновления; и оценивать: оценивать критерии объектов в сеансе.

В трех из 4 строк таблицы будет стоять префикс «Мистер». Однако изменения не фиксируются и, следовательно, не будут отражены в табличном представлении SQLiteStudio. Он будет обновлен только после фиксации сеанса.