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 中类列表中的 [ , ] 和单引号? [关闭]