动态SQL查询Psycopg2值问题

问题描述 投票:0回答:1

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

变量包括:1。表名2.列名的变量列表3.变量值列表,理想情况下在一个语句中输入多行

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

使用psycopg2中的SQL模块,我已经解决了动态添加表名和列列表的问题。但是我真的在努力添加VALUES。首先,将值作为%(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:语法错误处于或接近“%”LINE 1:...(“Col1”,“Col2”,“Col3”)值(%(val1)s ... ^

python postgresql psycopg2
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.