使用Python变量搜索SQLite3数据库

时间:2016-11-28 23:29:58

标签: python sql select sqlite

我正在尝试使用pythonic变量作为搜索词搜索我的SQLite3数据库。我正在搜索的术语是数据库中单元格内容的一部分(例如单元格中的Smith:[Harrison GB, Smith JH])并且通常位于字符串的中间在一个牢房里。

我尝试过编码,如下所示:

def read_from_db():
    c.execute("SELECT authors, year, title, abstract FROM usertable WHERE authors LIKE (?)",(var1,))
    data = c.fetchall()
    print(data)
    for row in data:
        searchlist.append(row)

var1="Smith"
read_from_db()

这应该逐行显示结果。但是,当var1 =“ Smith ”时,我得到0结果。当我将其值更改为“ Harrison GB,Smith JH ”时,我得到了所有结果。

当我尝试通过更改SQLite3执行查询来解决它时,我会产生错误。

ERROR
    c.execute("SELECT authors, year, title, abstract FROM usertable WHERE authors LIKE '%?%'",(var1,))
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 1 supplied.

如果我用以下内容更改结尾,我会收到语法错误:$?$,(%?%)等。我试过这个:

...authors="%?%"

但这也不起作用。关于SO有一些类似的问题,但它们并没有完全解决我的问题...

我在Windows 10上运行Python 3.4和SQLite3。

1 个答案:

答案 0 :(得分:3)

考虑将%通配符连接到绑定值var1

c.execute("SELECT authors, year, title, abstract" +
          " FROM usertable WHERE authors LIKE (?)", ('%'+var1+'%',))

您需要这样做的原因是?占位符在参数化查询和LIKE表达式中替换字符串文字,值一起使用的通配符是字符串文字,用括号中的单引号表示: / p>

SELECT authors, year, title, abstract FROM usertable WHERE authors LIKE '%Smith%'

您的初始尝试失败,因为您使用单引号包装?并且游标无法正确地将该参数绑定到预准备语句,因此该符号将字面上作为问号。