我有一个游戏服务器的插件,记下对地图所做的更改。数据库包含这样格式的条目 - 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,无论我为什么放入功能。如果我在控制台中执行这些操作似乎工作正常,但如果我将它们包装在函数中则不行。
答案 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())
可以更改为if
isinstance(keyword, (int,str))
或者更好的是,不要测试类型。
正如你所写,关键字可以
不是unicode字符串。为什么
像这样限制?在这种情况下我
认为最好使用
一个try...except...
块来捕获后续的
错误比限制类型。
len(entry) = 1
。注意
此外,它可能永远不会到达
如果关键字不是类型,则此行
int或str。在那种情况下,你会的
自进入以来在第(4)行得到错误
不会被定义.. 这也可以写成
qmarks = ' OR '.join(['?']*len(entry))
它避免了("? OR " *1)[:-4]
中有些神奇数字4的需要。
你在这看到什么?如果它是
空的,应该是一个线索。它也值得运行
print(statement)
以全面了解发送给.execute()
的内容。
也许尝试
statement = 'SELECT {0} FROM main WHERE {1} = ?'.format(
returncolumn,column)
特别是,is
应更改为=
。