psycopg2查询没有正确解析参数?

时间:2016-12-28 22:47:46

标签: python amazon-redshift psycopg2 psql

将python 2.7.12与psycopg2版本2.6.2一起使用并且没有成功提交生成的查询(而不是我刚输入的字符串)。查询AWS RedShift实例。

当我尝试运行代码时会发生的事情是它失败了,因为添加了无关的括号(当我使用(%s)构造时...或者如果我只使用{{1}则会添加额外的单引号而不是)。我已经尝试过非常仔细地查看文档,并且还在这里和谷歌进行了搜索,但我无处可去。有没有人对如何解决这个问题有任何建议?

我已经非常努力地遵循http://initd.org/psycopg/docs/usage.html#query-parameters处的文档: enter image description here

我的代码如下所示:

%s

产生此输出:

con = psycopg2.connect(dbname=dbname, host=host, port=port, user=user, password=password)
cur = con.cursor()

try3 = "TRUNCATE TABLE (%s);"
values = ("schema_one.tbl_six",)
cur.execute(try3,values)

try4 = "TRUNCATE TABLE %s;"
values = ("schema_four.tbl_four",)
cur.execute(try4,values)  

1 个答案:

答案 0 :(得分:3)

您有一个特殊情况,稍后将在docs中说明:

  

只应通过此方法绑定变量值:不应该   用于设置表或字段名称。对于这些元素,普通的字符串   在运行execute()之前应该使用格式化。

换句话说,您无法参数化表格或列名称并且必须使用字符串格式

query = "TRUNCATE TABLE %s;"
values = ("schema_one.tbl_six",)
cur.execute(query % values)

或者str.format()

query = "TRUNCATE TABLE {table_name};"
cur.execute(query.format(table_name="schema_one.tbl_six"))

也就是说,即使您信任源,您仍应小心并验证/转义表名以防止SQL injection attacks