2017-02-14 11 views
1

Предположим, мы имеем таблицу Postgres с целочисленного столбца массива xs:Как заменить элементы массива Postgres с помощью ORM SQLAlchemy?

create table mytable (
    id bigserial primary key, 
    xs int[] 
); 

Использование Postgres 9.4 и SQLAlchemy 1.0.14, я хочу, чтобы заменить одно значение (например 123) во всех строках в столбце xs , То, что у меня сейчас есть сырая SQL-запрос, который выглядит как

update mytable set xs = array_replace(xs, 123, 456) where 123 = any(xs) 

123 = any(xs) только ускорить запрос как в противном случае мы бы заменить все строки не относительно того, является ли интересное значением в массиве или нет.

Как я могу переписать вышеуказанный запрос, используя ORM SQLAlchemy, когда у меня уже есть MyTable?

ответ

2

Предполагая, что вы используете правильный тип postgresql.ARRAY:

from sqlalchemy import func 

session.query(MyTable).\ 
    filter(MyTable.xs.any(123)).\ 
    update({MyTable.xs: func.array_replace(MyTable.xs, 123, 456)}, 
      synchronize_session=False) 

Изменение synchronization по мере необходимости.

+0

Отличный ответ! Благодаря! – Timo