我正在处理一些python代码,以对redshift(postgres)SQL数据库运行查询,但是我遇到了一个问题,即我无法从变量中剥离周围的单引号, m传递给查询。我正在尝试从列表中删除一些表。这是我代码的基础:
def func(table_list):
drop_query = 'drop table if exists %s' #loaded from file
table_name = table_list[0] #table_name = 'my_db.my_table'
con=psycopg2.connect(dbname=DB, host=HOST, port=PORT, user=USER, password=PASS)
cur=con.cursor()
cur.execute(drop_query, (table_name, )) #this line is giving me trouble
#cleanup statements for the connection
table_list = ['my_db.my_table']
调用func()时,出现以下错误:
syntax error at or near "'my_db.my_table'"
LINE 1: drop table if exists 'my_db.my_table...
^
是否可以从列表项中删除周围的单引号?
暂时,我做错了(认为是什么),并使用了字符串连接,但是知道这基本上是乞求SQL注入的。
答案 0 :(得分:2)
psycopg2的工作方式不是这样。您正在使用字符串运算符%s
替换为字符串。这样做的原因是为了安全地对字符串进行标记,以避免SQL注入,而psycopg2处理其余部分。
您需要在查询进入execute语句之前对其进行修改。
drop_query = 'drop table if exists {}'.format(table_name)
但是,我警告您,不允许外部源创建这些表名,否则,您可能会面临SQL注入的风险。
但是新版PSYCOPG2允许类似的内容
http://initd.org/psycopg/docs/sql.html#module-psycopg2.sql
from psycopg2 import sql
cur.execute(
sql.SQL("insert into {} values (%s, %s)")
.format(sql.Identifier('my_table')),
[10, 20])
答案 1 :(得分:-1)
我很确定这不是最好的方法,但是您可以使用replace()函数删除特定的符号或字符串的一部分。这应该起作用:
sanitizeMe()