Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python和sqlite进行关键字搜索_Python_Database_Sqlite - Fatal编程技术网

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

使用python和sqlite进行关键字搜索,python,database,sqlite,Python,Database,Sqlite,我有一个游戏服务器插件,它可以记录对地图所做的更改。数据库包含如下格式的条目-id INTEGER主键、matbefore INTEGER、matafter INTEGER、name VARCHAR(50)、date。我试图创建一个函数,当给定一个列名、一个整数、字符串或整数或字符串的元组以及一个关键字时,该函数将查找所选条目。到目前为止,这是我得到的代码- def readdb(self,keyword,column,returncolumn = "*"): self.memwrite

我有一个游戏服务器插件,它可以记录对地图所做的更改。数据库包含如下格式的条目-id INTEGER主键、matbefore INTEGER、matafter INTEGER、name VARCHAR(50)、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())
关键字是要搜索的关键字,列是要搜索的列,returncolumn是要返回的列,所以我想知道为什么这段代码总是不获取行,例如-不返回任何行,无论我为函数输入了什么。如果我在控制台中执行这些操作,它似乎工作得很好,但如果我将它们封装在函数中,它就不会工作了

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())
  • 不知道这是怎么回事 做你是说self.memwrite()
  • 如果需要,可以更改为
    
    isinstance(关键字,(int,str))

    或者更好的是,不要测试类型。 正如您所写的,关键字可以 不是unicode字符串。为什么? 像这样限制?在这种情况下,我 我觉得用它会更好 a
    尝试…除了…
    块以捕获后续 限制类型时出现错误

  • 所以充其量
    len(entry)=1
    。通知 而且,它可能永远无法到达 如果关键字不是类型,则此行 int或str。在这种情况下,您将 在第(4)行中获取一个错误,因为输入 不会被定义
  • 这也可以写成

    qmarks = ' OR '.join(['?']*len(entry))
    
    它避免了在
    (“?或”*1)[:-4]
    中使用有点神奇的数字4

  • 你在这里看到什么?如果是 空的,这应该是一个线索。也值得一试
    打印(语句)
    以获取发送到
    .execute()
    的内容的完整信息

  • 也许试试

    statement = 'SELECT {0} FROM main WHERE {1} = ?'.format(
                 returncolumn,column)
    
    特别是,
    is
    应更改为
    =


  • 如果
    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将看到:

    从名称为'Able'或'Baker'或'Charlie'的main中全选*

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

    即使您解决了这个问题(例如使用整数查询):

    从id=1、2或3的主菜单中选择全部*


    您将得到神秘的结果,因为这意味着
    其中((id=1)或2)或3)
    ,而不是您认为它所做的。。。你需要
    WHERE id=1或id=2或id=3
    或(回到昨天的问题)
    WHERE id IN(1,2,3)

    你的第1点和第5点是昨天在OP上提出的,当时他问了几乎相同的问题(有两个不同版本的代码,没有一个是他实际运行的代码),然后删除了他的问题。我预测获取任何实际错误消息或正在执行的SQL语句的打印会有困难;信不信由你,这些据称出现在服务器的控制台上,并在被捕获之前滚动掉。祝您玩得开心…回答您的问题:(1)-是的,这是一个打字错误,感谢您找到它,尽管它除了用其他(工作)功能的信息更新数据库外,没有做任何相关的事情。运行此语句时得到的结果是“无”。我确实有一个打印行,但我在发布问题时删除了它。好的,我知道你要去哪里了。。再一次,为另一个帖子感到抱歉。。我太傻了,没有提供所有的信息