使用python和sqlite进行关键字搜索
我有一个游戏服务器插件,它可以记录对地图所做的更改。数据库包含如下格式的条目-id INTEGER主键、matbefore INTEGER、matafter INTEGER、name VARCHAR(50)、date。我试图创建一个函数,当给定一个列名、一个整数、字符串或整数或字符串的元组以及一个关键字时,该函数将查找所选条目。到目前为止,这是我得到的代码-使用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
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())
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)-是的,这是一个打字错误,感谢您找到它,尽管它除了用其他(工作)功能的信息更新数据库外,没有做任何相关的事情。运行此语句时得到的结果是“无”。我确实有一个打印行,但我在发布问题时删除了它。好的,我知道你要去哪里了。。再一次,为另一个帖子感到抱歉。。我太傻了,没有提供所有的信息