2017-02-14 4 views
1

Angenommen, wir haben eine Postgres Tabelle mit einer Integer-Array Spalte xs:Wie ersetzt man Postgres-Array-Elemente mit SQLAlchemy ORM?

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

Postgres 9,4 und SQLAlchemy Mit 1.0.14, möchte ich einen einzelnen Wert ersetzen (zB 123) in allen Reihen in Spalte xs . Was ich habe, ist jetzt eine rohe SQL-Abfrage, die nur

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

Die 123 = any(xs) ist wie

schaut zu beschleunigen Abfrage als sonst würden wir alle Zeilen ersetzen nicht darüber, ob der interessante Wert im Array oder nicht.

Wie könnte ich die obige Abfrage mit dem SQLAlchemy ORM neu schreiben, wenn ich bereits MyTable zugeordnet habe?

Antwort

2

Angenommen, Sie die korrekte postgresql.ARRAY Typ verwenden:

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) 

Ändern Sie den synchronization wie nötig.

+0

Große Antwort! Vielen Dank! – Timo