2017-02-14 2 views
1

Supposons que nous ayons une table Postgres avec une colonne de tableau entier xs:Comment remplacer les éléments du tableau Postgres à l'aide de SQLAlchemy ORM?

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

En utilisant Postgres 9.4 et SQLAlchemy 1.0.14, je veux remplacer une valeur unique (par exemple 123) dans toutes les lignes dans xs colonne . Ce que j'ai maintenant une requête SQL brute qui ressemble

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

Le 123 = any(xs) est juste pour accélérer la requête sinon nous remplacer toutes les lignes non quant à savoir si la valeur est intéressante dans le tableau ou non.

Comment est-ce que je pourrais réécrire la question ci-dessus en utilisant le SQLAlchemy ORM quand j'ai déjà MyTable mappé?

Répondre

2

En supposant que vous utilisez le type postgresql.ARRAY correct:

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) 

Modifier la synchronization si nécessaire.

+0

Bonne réponse! Merci! – Timo