替换 psycopg2.sql.Composed 对象中的单词

Replacing a word in a psycopg2.sql.Composed object

我有一个相当复杂的 psycopg2.sql.Composed 对象,我只需要在其上替换一个词以解决追溯兼容性问题。

在拥有这样一个对象之前,我有一个 f-string,这个片段在上面发挥了很大的作用:

if v4:
    sql_update_query = re.sub(
        'word_to_replace,',
        'new_replacement_word',
         sql_update_query
    )

我天真地试图在 psycopg2.sql.Composed 对象上做:

if v4:
    sql_update_query = re.sub(
        'word_to_replace,',
        'new_replacement_word',
         sql_update_query.as_string(conn) # conversion to a string for re.sub() to work
    )

没关系,但是如何恢复到真正的 psycopg2.sql.Composed 对象?

没关系,我注意到替换仅在列标识符上完成。

因此,我将它们提取到列表中并在列表本身内进行替换,例如如:

columns_list = [
    re.sub(
        '^word_to_replace$',
        'new_replacement_word',
        col
    ) for col in columns
] 

请注意,我在单词末尾有一个逗号,以替换原来的 post;这是一个技巧,因为有些列以相同的名称开头,但随后又以 _suffixes 开头。因此,我必须至少在 re.sub() 第一个表达式中使用美元符号,我将要替换的词限制为这个特定的词,让所有后缀版本保持不变。

然后我将列添加为 sql.Identifier:

sql.SQL(', ').join(map(sql.Identifier, columns_list)),

瞧瞧。