我正在使用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”。
任何帮助将不胜感激。
答案 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。