动态SQL查询Psycopg2值问题

时间:2019-04-20 07:56:29

标签: python postgresql psycopg2

使用Python和psycopg2,我试图构建一个动态SQL查询以将行插入表中。

变量是:     1. 表名     2. 列名称的可变列表     3. 可变值列表,最好在一条语句中输入多行

我遇到的问题是如何处理从Python到SQL和psycopg2的字符串文字,从而避免将代码暴露给SQL注入攻击。

使用来自psycopg2的SQL模块,我解决了动态添加表名和列列表的问题。但是,我真的很难添加这些值。首先,这些值以%(val)s的形式放入查询中,并且看起来像这样直接传递给数据库,从而导致错误。

然后,我希望能够一次添加多行。

下面的代码。所有帮助,不胜感激:)

   import psycopg2 as pg2
   from psycopg2 import sql
   conn = pg2.connect(database='my_dbo',user='***',password='***')

   cols = ['Col1','Col2','Col3']
   vals = ['val1','val2','val3']

   #Build query
   q2 = sql.SQL("insert into my_table ({}) values ({})") \
   .format(sql.SQL(',').join(map(sql.Identifier, cols)), \
   sql.SQL(',').join(map(sql.Placeholder,vals)))

当我将此字符串打印为print(q2.as_string(conn))时,我得到:

插入my_table(“ Col1”,“ Col2”,“ Col3”)值%(val1)s,%(val2)s,%(val3)s

然后当我尝试执行这样的字符串时,出现以下错误:

ProgrammingError:语法错误在“%”或附近 第1行:...(“ Col1”,“ Col2”,“ Col3”)值(%(val1)s ......
                                          ^

1 个答案:

答案 0 :(得分:0)

好,我解决了这个问题。首先使用Literal而不是Placeholder,然后将行值作为元组中的元组放在一起,循环通过将每个元组作为文字添加到列表中,然后在构建查询时最后插入。