Python:如何从列表项中删除单引号

时间:2019-02-22 20:06:43

标签: python sql list amazon-redshift

我正在处理一些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注入的。

2 个答案:

答案 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()