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

Posted

技术标签:

【中文标题】Python:如何从列表项中删除单引号【英文标题】:Python: How to remove single quotes from list item 【发布时间】:2019-02-22 20:06:43 【问题描述】:

我正在编写一些 python 代码来运行对 redshift (postgres) SQL 数据库的查询,我遇到了一个问题,我无法从变量 I' 中删除周围的单引号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 注入。

【问题讨论】:

【参考方案1】:

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

您需要在查询到达执行语句之前对其进行修改。

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]
)

【讨论】:

如果您的应用程序是自包含的并且您只是注入一个预定义的列表,那也没关系。除非有人修改了你的代码,否则没有 SQL 注入的风险,那么 SQL 注入是你最不必担心的。 感谢您的及时答复!你的第一个解决方案对我有用,但就像你说的,它仍然容易被注入。唯一的可取之处是,这只能由(理论上)技术能力强的同事使用。第二个似乎更好,但我正在使用的 python 版本似乎无法导入它。不知道为什么我在 2.7.5... 如果不是用户导入的数据,则不容易受到SQL注入的影响。只有当外部源将数据输入您的应用程序时,SQL 注入才是一个问题,而不是应用程序本身。 数据来自 csv 然后使用第二个例子。【参考方案2】:

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

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

【讨论】:

这行不通。 Psycopg2 添加引号本身,它不是字符串的一部分。

以上是关于Python:如何从列表项中删除单引号的主要内容,如果未能解决你的问题,请参考以下文章

如何在单行代码中删除 python 3 中类列表中的 [ , ] 和单引号? [关闭]

如何将包含单引号和双引号值的 Python 列表转换为所有双引号值

使用双引号而不是单引号返回 Python 列表中的变量

如何从字符串列表中删除引号并将其再次存储为列表..?

如何从R中的字符串中删除单引号?

Amazon Redshift 字符串列出删除多个单引号