替换 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)),
瞧瞧。
我有一个相当复杂的 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)),
瞧瞧。