如何在 psycopg2 中将列名作为参数传递?

how to pass column name as parameter in psycopg2?

使用python3.4.3,通过pip安装psycopg2

col = 'concept'
cur.execute("select  regexp_split_to_array( %s ,';') from MyTable limit 200",(col,))

给我这样的结果:

(['concept'],)

我的建议是 psycopg2 生成如下 sql 查询:

SELECT 
    REGEXP_SPLIT_TO_ARRAY('concept',';')
FROM
    MyTable
LIMIT 200

所以我稍微修改了一下代码,

cur.execute("select  regexp_split_to_array(" + col + " ,';') from MyTable limit 200")

它可以工作,但字符串连接很丑陋,而且在 sql 中通常很危险。有更好的方法吗?

不幸的是,您或多或少必须自己创建这样一个 SQL 字符串,尽管使用字符串连接可能有更漂亮的方法。

您是正确的,允许未经验证的用户输入作为 SQL 查询的一部分可能很危险(搜索 "SQL injection" 以找到丑陋的细节)。虽然可以使用通常称为 "parameterized queries" 的方法将数据值插入到 SQL 中,但不幸的是,这种技术不能用于列名。这样做的原因有些复杂 - 参数化用于准备语句的优化版本以供执行,并且允许变量列名会使优化无效。

但是,您可以使用任何一种 Python 的字符串格式化技术来创建语句,其中任何一种都比连接更漂亮。

"select regexp_split_to_array(%s ,';') from MyTable limit 200" % col

"select regexp_split_to_array({} ,';') from MyTable limit 200".format(col)

都会创建您需要的语句。