Postgres更新表->更改文本中的子字符串[]

时间:2019-03-03 08:05:05

标签: python postgresql sqlalchemy sql-update

我正在使用Python,SQLAlchemy(我不使用ORM)和Postgres。我在Postgres中有一个表格,其中包含两个text []字段(与&的字段)和其他一些字段(无关)。如果“ from”列包含子字符串“ priority”,则“ to”列可能包含子字符串“ head”。如果可以,我想将其更改为“ tail”。另外,我也对解决方案感到满意,可以将整个“ to” 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 :(得分:1)

您可以使用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:<@表示“包含于”,请参见https://www.postgresql.org/docs/current/functions-array.html