Postgres обновить таблицу -> изменить подстроку в тексте [] - PullRequest
0 голосов
/ 03 марта 2019

Я работаю с Python, SQLAlchemy (я не использую ORM) и Postgres.У меня есть таблица в Postgres, которая включает в себя два поля text [] (to & from) и некоторые другие (неактуальные).Если столбец «from» содержит подстроку «priority», то столбец «to» может содержать подстроку «head».Если это так, я хотел бы изменить его на «хвост».В качестве альтернативы я также был бы доволен решением изменить весь столбец 'to' text [].

table: с text [] на text []

Что я сделал до сих пор:

eng = engine.execute("select to from table, unnest(from) f where f like (%s);", ('%priority%'))

for row in eng:
   if row[0][0].find('head'):
       row[0][0].replace('head', 'tail')

Теперь я не знаю, как сделать ОБНОВЛЕНИЕ

Я попытался:

#this only updates it, but if the next time I do the first query it's still the same(I know it's because it's only a select statement. I just included it if it might be helpful somehow)
engine.execute('SELECT regexp_replace(to::varchar, %s, %s) from table, 'head', 'tail');

Затем я попытался:

engine.execute("update table set to = (%s) WHERE to = (%s)", 'head', 'tail')

Вероятно, было бы лучше, если бы в операторе UPDATE также содержалось условие, что 'from' должен включать в себя слово 'priority'.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 03 марта 2019

Вы можете решить всю проблему исключительно с помощью sql.Вот вам:

update table
    -- replace head by tail in the to-array
    set to = array_replace(to, 'head', 'tail')
where ARRAY['priority'] <@ from
    and ARRAY['head'] <@ to

Примечание 1: Возможно, вам нужно заключить свои имена (в таблицу, из, в) в "", поскольку они являются зарезервированными ключевыми словами в sql.

update "table"
    set "to" = array_replace("to", 'head', 'tail')
where ARRAY['priority'] <@ "from"
    and ARRAY['head'] <@ "to"

Примечание 2: <@ означает «содержится в», см. <a href="https://www.postgresql.org/docs/current/functions-array.html" rel="nofollow noreferrer">https://www.postgresql.org/docs/current/functions-array.html.

...