【问题标题】:Using variable combining LIKE and %s% in SQLite and Python在 SQLite 和 Python 中使用结合 LIKE 和 %s% 的变量
【发布时间】:2017-06-06 11:07:02
【问题描述】:

使用:

  • 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

我的问题是:

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

【问题讨论】:

    标签: python sqlite tkinter


    【解决方案1】:

    试试:

    kword = "%"+kword+"%"
    c.execute("SELECT * FROM my_lib WHERE kappa LIKE '%s'" % kword)
    

    【讨论】:

      【解决方案2】:

      在反复尝试之后,我得到了实际的解决方案。看来我不能像字符串一样将“%”添加到变量中,而是:

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

      【讨论】:

      • 查询数据库时不应使用 fstring,因为它可用于使用 SQL cmets 将代码注入到查询中。
      【解决方案3】:

      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

      【讨论】:

      • 非常感谢!这帮助很大。
      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2021-04-16
      • 2020-07-30
      相关资源
      最近更新 更多