使用python和sqlite进行关键字搜索

时间:2010-11-07 22:08:23

标签: python database sqlite

我有一个游戏服务器的插件,记下对地图所做的更改。数据库包含这样格式的条目 - id INTEGER PRIMARY KEY,matbefore INTEGER,matafter INTEGER,name VARCHAR(50),date DATE。我正在尝试创建一个函数,当给定列名称,整数,字符串或整数或字符串的元组和关键字时,将找到所选的条目。到目前为止,这是我来的代码 -

def readdb(self,keyword,column,returncolumn = "*"):
    self.memwrite
    if isinstance(keyword, int) or isinstance(keyword,str):
        entry = [keyword]
    qmarks = ("? OR " * len(entry))[:-4]
    statement = 'SELECT all {0} FROM main WHERE {1} is {2}'.format(returncolumn,column,qmarks)
    print(qmarks)
    self.memcursor.execute(statement, entry)
    return(self.memcursor.fetchall())

keyword是要搜索的关键字,column是要搜索的列,而returncolumn是要返回的列所以我想知道为什么这段代码总是不提取任何行,EG - 返回None,无论我为什么放入功能。如果我在控制台中执行这些操作似乎工作正常,但如果我将它们包装在函数中则不行。

2 个答案:

答案 0 :(得分:1)

如果entry是一个列表(就像在昨天的问题中那样),它就无法运行。

>>> returncolumn = "*"
>>> column = "name"
>>> entry = ["Able", "Baker", "Charlie"]
>>> qmarks = ("? OR " * len(entry))[:-4]
>>> statement = 'SELECT all {0} FROM main WHERE {1} is {2}'.format(returncolumn,
column,qmarks)
>>> print statement
SELECT all * FROM main WHERE name is ? OR ? OR ?

以及SQLite将会看到的是:

SELECT all * FROM main WHERE name is 'Able' OR 'Baker' OR 'Charlie'

这是无效的语法,因为您需要=,而不是is

即使你修复了它(例如使用整数查询):

SELECT all * FROM main WHERE id = 1 or 2 or 3

你会得到神秘的结果,因为这意味着WHERE ((id = 1) or 2) or 3),而不是你的想法...你需要WHERE id = 1 or id = 2 or id = 3或(回到昨天的问题)WHERE id IN (1,2,3)

答案 1 :(得分:0)

def readdb(self,keyword,column,returncolumn = "*"):
    self.memwrite                                             # 1. 
    if isinstance(keyword, int) or isinstance(keyword,str):   # 2.
        entry = [keyword]                                     # 3.
    qmarks = ("? OR " * len(entry))[:-4]                      # 4.
    statement = 'SELECT all {0} FROM main WHERE {1} is {2}'.format(returncolumn,column,qmarks)
    print(qmarks)                                             # 5.
    self.memcursor.execute(statement, entry)
    return(self.memcursor.fetchall())
  1. 不确定这应该是什么 做。你的意思是self.memwrite()?
  2. 可以更改为if isinstance(keyword, (int,str))

    或者更好的是,不要测试类型。 正如你所写,关键字可以 不是unicode字符串。为什么 像这样限制?在这种情况下我 认为最好使用 一个try...except...块来捕获后续的 错误比限制类型。

  3. 最好是len(entry) = 1。注意 此外,它可能永远不会到达 如果关键字不是类型,则此行 int或str。在那种情况下,你会的 自进入以来在第(4)行得到错误 不会被定义..
  4. 这也可以写成

    qmarks = ' OR '.join(['?']*len(entry))
    

    它避免了("? OR " *1)[:-4]中有些神奇数字4的需要。

  5. 你在这看到什么?如果它是 空的,应该是一个线索。它也值得运行 print(statement)以全面了解发送给.execute()的内容。

  6. 也许尝试

    statement = 'SELECT {0} FROM main WHERE {1} = ?'.format(
                 returncolumn,column)
    

    特别是,is应更改为=