在SQLite和Python中使用变量组合LIKE和%s%

时间:2017-01-21 15:12:02

标签: python sqlite tkinter

使用:

  • Python3

  • SQLite的

  • 使用TKinter

我目前正在尝试创建一个在数据库中搜索关键字的函数,但是一旦我尝试将它与TKinter结合起来,它似乎就失败了。

以下是相关行: (我尝试了很多不同的方法,下面的3行似乎与变量一起使用,但不是TKinter的输入,所以我认为它们实际上可以工作,如果我稍微编辑它们。

我得到的问题是,我在TKinter和SQLite中没有经验,并且已经和那些2人一起工作了大约3天。

def searcher(column):

    #Getting input from user (TKinter)
    keyword = tk.Entry(self)
    keyword.pack()

    #Assigning the input to a variable
    kword = keyword.get()

    c.execute("SELECT * FROM my_lib WHERE {kappa} LIKE {%goal%}".format(kappa=column, goal=kword))
    #c.execute("SELECT * FROM my_lib WHERE "+column+"=?", (kword,))
    #c.execute("SELECT * FROM my_lib WHERE {} LIKE '%kword%'".format(column))

我想检查是否有任何数据包含关键字,所以基本上:

k_word in column_data

而不是

column_data == k_word

我的问题是:

有没有办法获取用户输入(通过TKinter)并在数据库(SQLite)中搜索并检查数据库中的任何数据是否包含关键字

2 个答案:

答案 0 :(得分:1)

SQLite文档解释了您可以在查询字符串中使用?作为占位符,这样您就可以替换值的元组。他们还建议反对使用Python的字符串操作(如下所述)使用变量组装完整查询:

c.execute("SELECT * FROM my_lib WHERE ? LIKE ?", (column, '%'+kword+'%'))

您可以在上面看到我将%kword连接起来,这将被替换为第二个?。这也是安全的,这意味着它可以在需要时防止SQL注入攻击。

文档:https://docs.python.org/2/library/sqlite3.html

相关帖子:Escaping chars in Python and sqlite

答案 1 :(得分:0)

经过一遍又一遍的尝试,我得到了实际的解决方案。好像我不能只是添加'%'变量就像一个字符串,而是:

c.execute("SELECT * FROM my_lib WHERE {} LIKE '%{}%'".format(column, kword))