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

Python:如何从列表项中删除单引号,python,sql,list,amazon-redshift,Python,Sql,List,Amazon Redshift,我正在编写一段python代码来运行对redshift(postgres)SQL数据库的查询,我遇到了一个问题,我无法从传递给查询的变量中去掉周围的单引号。我正试图从列表中删除一些表。这是我的代码的基础: def func(table_list): drop_query = 'drop table if exists %s' #loaded from file table_name = table_list[0] #table_name = 'my_d

我正在编写一段python代码来运行对redshift(postgres)SQL数据库的查询,我遇到了一个问题,我无法从传递给查询的变量中去掉周围的单引号。我正试图从列表中删除一些表。这是我的代码的基础:

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注入。

我很确定这不是最好的方法,但可以使用replace()函数删除字符串的特定符号或部分。这应该起作用:

cur.execute(drop_query, (table_name.replace("'", ""), ))

这不是psycopg2的工作方式。您正在使用字符串运算符
%s
替换为字符串。这样做的原因是为了安全地标记您的字符串,以避免SQL注入,psycopg2处理其余部分

在查询到达execute语句之前,需要修改查询

drop_query = 'drop table if exists {}'.format(table_name)
但是,我警告您,不要允许外部源创建这些表名,否则您将面临SQL注入的风险

然而,新版本的PSYCOPG2允许类似的功能


如果你的应用程序是自包含的,并且你只是注入了一个预定义的列表,那么就可以了。除非有人修改您的代码,否则不会有SQL注入的风险,而SQL注入是您最不担心的问题。感谢您这么及时的回答!你的第一个解决方案对我有效,但正如你所说,它仍然容易被注射。唯一的可取之处是,这只能由(理论上)有技术能力的同事使用。第二个似乎更好,但我正在使用的python版本似乎无法导入。不知道为什么bc我在2.7.5上…如果不是用户导入的数据,它就不会受到SQL注入的攻击。只有当外部源向应用程序而不是应用程序本身提供数据时,SQL注入才是一个问题。数据来自CSV,请使用第二个示例。这将不起作用。Psycopg2添加引号本身,它不是字符串的一部分。
from psycopg2 import sql

cur.execute(
    sql.SQL("insert into {} values (%s, %s)")
        .format(sql.Identifier('my_table')),
    [10, 20])