2014-05-04 42 views
0

尝试执行SQLite3查询时出现语法错误。问题是因为变量inputPattern包含's。Python,SQLite:'%s'中的撇号

功能是:

def searchForExactEnglishToCzechTranslation(inputPattern,db): 
    if "\'" in inputPattern: 
     inputPattern.replace("'","''") 
    result = db.execute("SELECT czech FROM translations WHERE english='%s'" % (inputPattern)).fetchall() 

我想更换标志“,但仍无法工作的。

你会给我一个建议吗?谢谢

回答

4

不要使用插值;使用SQL参数:

def searchForExactEnglishToCzechTranslation(inputPattern,db): 
    result = db.execute("SELECT czech FROM translations WHERE english=?", 
         (inputPattern,)).fetchall() 

这需要照顾引用的(在?没有用引号括起来),并逃逸。

引述sqlite3 module documentation

通常你的SQL操作将需要从Python的变量使用的值。你不应该使用Python的字符串操作来组装你的查询,因为这样做是不安全的;它会使您的程序容易受到SQL注入攻击(请参阅http://xkcd.com/327/以了解可能出错的幽默示例)。

而是使用DB-API的参数替换。将?作为占位符,无论您想要使用某个值,然后提供一个值元组作为游标的​​方法的第二个参数。 (其他数据库模块可以使用不同的占位符,如%s:1。)

+1

今天我得知python文档引用XKCD。 – roippi

+0

@roippi:尊重是相互的;请参阅http://xkcd.com/353/和/或打开Python并键入'import antigravity'。 –

+0

@MartijnPieters谢谢你的作品! – Mill