【问题标题】:Keyword search using python and sqlite使用 python 和 sqlite 进行关键字搜索
【发布时间】:2011-05-06 10:04:25
【问题描述】:

我有一个游戏服务器插件,可以记录对地图所做的更改。数据库包含格式如下的条目 - 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 - Returns None,不管我为功能。如果我在控制台中做这些事情似乎可以正常工作,但如果我将它们包装在一个函数中就不行了

【问题讨论】:

    标签: python database sqlite


    【解决方案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)

    【讨论】:

    • 好的,我知道你要去哪里了.. 再次抱歉,其他帖子.. 我很愚蠢,没有提供所有信息
    【解决方案2】:
    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。注意 此外,它可能永远无法到达 如果关键字不是类型,则此行 整数或字符串。在这种情况下,你会 自进入以来第 (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 更改为=

    【讨论】:

    • 您的第 1 点和第 5 点是昨天向 OP 提出的,当时他问了很多相同的问题(使用两个不同版本的代码,没有一个是他实际运行的代码),然后删除了他的问题。我预测很难获得任何实际的错误消息或正在执行的 SQL 语句的打印;信不信由你,据称这些内容会出现在服务器的控制台上并在被捕获之前滚动关闭。玩得开心...
    • 回答您的问题:(1)- 是的,这是一个错字,感谢您找到它,尽管它除了使用来自其他(工作)功能的信息更新数据库之外没有做任何相关的事情.运行此语句时得到的结果是无。我确实有一个打印行,但我在发布问题时删除了它。
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多