将可变列检索列表注入 SQL 查询的最佳方法(通过 psycopg2 执行)
Best way to inject a variable column retrieval list into an SQL query (via psycopg2 execution)
我有这样的查询:
SELECT_DATA = """select *
from schema.table tb
order by tb.created_time
"""
但是,我不想选择 table 中的所有列,而是想通过我在 Python 中通过 psycopg2 注入提供的指定列列表进行检索。提供的列列表字符串如下所示:
'col1, col2, col3'
很简单,除了我还需要将 table 别名“tb”附加到每个列名的开头,因此它需要看起来像:
'tb.col1, tb.col2, tb.col3'
因此查询结果为:
SELECT_DATA = """select tb.col1, tb.col2, tb.col3
from schema.table tb
order by tb.created_time
"""
我脑子里想的最直接的方法是将给定的字符串解析为逗号分隔的列表,附加“tb”。到每个列名的开头,然后将列表解析回一个字符串以进行注入。但这看起来很混乱,很难理解,所以我想知道是否有更好的方法来处理这个问题?
拆分 comma-separated 字符串后考虑 sqlIdentifiers
的列表理解:
commas_sep_str = "col1, col2, col3"
field_identifiers = [sql.Identifier(s) for s in commas_sep_str.split(',')]
query = (sql.SQL("select {fields} from {schema}.{table}")
.format(
fields=sql.SQL(',').join(field_identifiers),
schema=sql.Identifier('my_schema')
table=sql.Identifier('my_table')
)
)
我有这样的查询:
SELECT_DATA = """select *
from schema.table tb
order by tb.created_time
"""
但是,我不想选择 table 中的所有列,而是想通过我在 Python 中通过 psycopg2 注入提供的指定列列表进行检索。提供的列列表字符串如下所示:
'col1, col2, col3'
很简单,除了我还需要将 table 别名“tb”附加到每个列名的开头,因此它需要看起来像:
'tb.col1, tb.col2, tb.col3'
因此查询结果为:
SELECT_DATA = """select tb.col1, tb.col2, tb.col3
from schema.table tb
order by tb.created_time
"""
我脑子里想的最直接的方法是将给定的字符串解析为逗号分隔的列表,附加“tb”。到每个列名的开头,然后将列表解析回一个字符串以进行注入。但这看起来很混乱,很难理解,所以我想知道是否有更好的方法来处理这个问题?
拆分 comma-separated 字符串后考虑 sqlIdentifiers
的列表理解:
commas_sep_str = "col1, col2, col3"
field_identifiers = [sql.Identifier(s) for s in commas_sep_str.split(',')]
query = (sql.SQL("select {fields} from {schema}.{table}")
.format(
fields=sql.SQL(',').join(field_identifiers),
schema=sql.Identifier('my_schema')
table=sql.Identifier('my_table')
)
)