我有一个组织成员(少于200人)的数据库(sqlite)。现在我正在尝试编写一个wx应用程序,它将搜索数据库并在wx.grid中返回一些联系信息。该应用程序将有2个TextCtrls,一个用于名字,一个用于姓氏。我想在这里做的是只能在textctrls中写一个或几个字母,然后开始返回结果。因此,如果我搜索“John Smith”,我会在第一个TextCtrl中写“Jo”,这将返回每个John(或任何其他名称以这些字母开头的名字)。它不会有“搜索”按钮,而是每按一次键就会开始搜索。
解决这个问题的一种方法是搜索数据库,例如“SELECT * FROM contactlistview WHERE forname LIKE'Jo%'”但这似乎是一个坏主意(每次击键时都非常重要的数据库?)。相反,我想到在像“SELECT * FROM contactlistview”之类的查询上使用fetchall(),然后,对于每次击键,搜索查询返回的元组列表。这就是我的问题:搜索列表并不困难,但如何使用通配符搜索元组列表?
答案 0 :(得分:2)
selected = [t for t in all_data if t[1].startswith('Jo')]
但是,衡量,不要猜测。我认为在某些情况下,查询会更快 - 特别是如果您有太多记录。也许你应该对第一个char使用查询,然后开始使用python-side过滤器,因为你已经有了结果。
答案 1 :(得分:2)
我认为通常,您不应该害怕向数据库提供任务。 LIKE
子句很可能非常快。 Sqlite是在相当强大的C代码中实现的,并且很乐意处理这样的查询。
如果您担心发送过多请求,为什么不在用户输入字符阈值后发送查询,例如三个?
如果您想要添加过滤,列表理解可能是返回结果的最佳方式。
答案 2 :(得分:0)
如果您正在使用LIKE搜索匹配开头的字符串,例如'abc%'(而不是字符串中的任何位置 - '%abc%'),如果您在字段上有索引,搜索应该非常快,因为db可以使用索引来帮助找到匹配项。