使用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 ......
^
答案 0 :(得分:0)
好,我解决了这个问题。首先使用Literal而不是Placeholder,然后将行值作为元组中的元组放在一起,循环通过将每个元组作为文字添加到列表中,然后在构建查询时最后插入。