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. Он будет обновлен только после фиксации сеанса.