Python:从MySQL查询中转义单引号

2024-09-26 22:51:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在循环中运行的查询字符串,并且对列表查询中的每个项都执行。列表包含字符串,我使用python字符串格式技术在迭代过程中用列表中相应的字符串替换查询。在

我已经将查询与列表中的字符串进行了unicoded:以下是我的unicoded查询:

query = ur'''SELECT something FROM some_table WHERE some_name LIKE "{this_name}%"'''

在执行之前,我将查询字符串编码为utf-8

^{pr2}$

但问题是,有时我会遇到来自list的字符串,它有单引号示例:foo's。我已经和utf-8进行了联通,我想这样做我就不用担心这样的情况了。但是我得到了sql错误,因为MySQL没有跳过单引号。在

我的下一次尝试是替换单引号:

format_string = u"foo's".replace(u"'",u"\'")

但这也没用。我还看到,this question的答案是使用mysqldb库的内置功能,我不知道,所以我寻求stackoverflow社区的帮助来解决这个问题。在

我更改代码以反映答案中建议的解决方案,但结果是相同的:以下是更改:

args = [u"{this_name}%".format(this_name=format_name)]
self.dbCursor.execute(query.encode('utf-8'), args)

在此行抛出错误:

错误:

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u014d' in position 4: ordinal not in range(256)

这是error正在抱怨的字符串,我已经检查了该字符串的类型,它是一个unicoded字符串。在

this_name= Sentōkisei type= <type 'unicode'>

Tags: 字符串答案nameformat列表foo错误args
1条回答
网友
1楼 · 发布于 2024-09-26 22:51:58

如果使用两个参数调用dbCursor.execute,则DB适配器将为您引用这些参数。有关详细信息,请参见DB-API specification

query = u'''SELECT something FROM some_table WHERE some_name LIKE %s'''
args = [u"{this_name}%".format(this_name=list_name)]
self.dbCursor.execute(query, args)

query中的%sparameter marker。它将替换为args中给定的带引号的参数。要使用的正确参数标记取决于您的DB适配器。例如,MySQLdb使用%s,而oursql和{a5}使用?。在

建议使用参数化SQL。你真的不应该自己引用论点。在


关于这个错误,你发布了

^{pr2}$

我假设这意味着format_name是unicode。因此

args = [u"{this_name}%".format(this_name=format_name)]

将使args成为一个包含一个unicode的列表。在

现在我们到达引起错误的那条线:

self.dbCursor.execute(query.encode('utf-8'), args)

query已经是unicode。如果对该unicode进行编码,那么它将变成str。所以query.encode('utf-8')str,但是{}是{}的列表。我不知道您为什么要编码query,但是您的DB适配器应该能够接受两个unicode参数。那就试试吧

self.dbCursor.execute(query, args)

现在,在重新阅读您的评论后,您似乎已经尝试过这种方法,但也会产生相同的错误:

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u014d' in position 75: ordinal not in range(256)

我不知道为什么DB适配器要用latin-1来编码unicode,而您需要utf-8。最好的解决方案是找到这个选择{}的来源。在

一个棘手的解决方法是尝试自己编码字符串:

query = u'''SELECT something FROM some_table WHERE some_name LIKE %s'''.encode('utf-8')
args = [u"{this_name}%".format(this_name=list_name).encode('utf-8')]
self.dbCursor.execute(query, args)

但我要强调的是,我真的不认为这是最好的方法,也不必这样做。在

相关问题 更多 >

    热门问题