如何在 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)
都会创建您需要的语句。
使用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)
都会创建您需要的语句。