Метод ordered_values класса Update
Метод ordered_values класса Update задает значения для обновления строк таблицы с сохранением порядка их передачи. В отличие от метода values, который принимает словарь и не гарантирует порядок параметров, метод ordered_values принимает пары «ключ-значение» в виде кортежей, и они попадают в SQL-запрос ровно в том порядке, в котором были указаны. Метод первым аргументом принимает переменное число кортежей вида (column, value).
Синтаксис
update(table).ordered_values((column1, value1), (column2, value2), ...)
Пример
Давайте создадим таблицу articles и обновим сразу несколько полей, сохранив порядок столбцов:
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, update
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'text': 'text 1', 'status': 'new', 'num': 1},
{'id': 2, 'title': 'article 2', 'text': 'text 2', 'status': 'new', 'num': 2},
])
stmt = (
update(articles)
.where(articles.c.id == 1)
.ordered_values(
(articles.c.title, 'article updated'),
(articles.c.status, 'done'),
(articles.c.num, 10),
)
)
res = conn.execute(stmt)
print(res.rowcount)
Результат выполнения кода:
1
Пример
Давайте посмотрим, какой SQL-запрос генерирует метод ordered_values:
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, update
from sqlalchemy.dialects import sqlite
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer),
)
stmt = (
update(articles)
.where(articles.c.id == 1)
.ordered_values(
(articles.c.title, 'article updated'),
(articles.c.status, 'done'),
(articles.c.num, 10),
)
)
print(stmt.compile(dialect=sqlite.dialect()))
Итоговый SQL запрос:
UPDATE articles SET title = ?, status = ?, num = ? WHERE articles.id = ?