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

时间:2016-03-05 09:53:00

标签: python-3.x psycopg2

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

class I
{
// code to be filled in
.....
.....
.....
};
int main()
{
for(I i=0; i<10; i++){ // to make this for loop work, what needs to be written in the class above?
cout << " " << endl;
}
......
......
return 0;
}

给我这样的结果:

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

我的建议是(['concept'],)生成如下的SQL查询:

psycopg2

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

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

它可以工作,但字符串concat是UGLY并且在sql中经常是危险的。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

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

你是正确的,允许未经验证的用户输入作为SQL查询的一部分可能是危险的(搜索&#34; SQL注入&#34;找到丑陋的细节)。虽然可以使用通常称为"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)

将创建您需要的语句。