2012-12-16 15 views
-1

我会后我的代码后解释,我是新来的这一切使裸露的我:如何停止搜索到数据库时,我已经有了结果

db = sqlite3.connect("Gene.sqlite") 
cur = db.cursor() 
cur.execute("SELECT * FROM Table") 
for i in cur.fetchall(): 
    if i[0] == name: 
    print '<br>' '<c><b>TYPE'':</b>' ' '+ i[1]+ '<br>'\ 
    '<b>DESCRIPTION:</b></c>' ' '+ i[2] 
    break 
else: 
    print 'This name does no exist in the Database' 

这是蟒蛇我正在创建一个用户输入名称的CGI脚本,并且我的脚本进入该数据库,搜索名称并打印出该名称的行。我有一个名为Table的数据库,其中包含数千个名称,我只希望用户输入一个名称,并通过表进行搜索,并找到与输入匹配的单个名称,如果名称存在,则打印必要的信息(如图所示)。然而,对于每一个不匹配的名字,它都会打印这个名字,直到它找到一个匹配,并且如果没有找到匹配,我就会得到数以千计的消息说“这个名字不存在”。基本上,我希望它在没有打印任何东西的情况下搜索表格,直到它找到名称,并且如果它找到名称,打印出信息,如果它不存在,只需打印一次“这个名称在数据库中不存在” 。

+0

SQL中'WHERE'子句的头? –

+0

为什么我[0]?谁保证我[0]永远是你正在寻找的领域? –

回答

3

你需要使用一个WHERE clause

db = sqlite3.connect("Gene.sqlite") 
cur = db.cursor() 
looking_for = 'hello' 
cur.execute("SELECT type,description FROM Table WHERE name = '%s'", (looking_for,)) 
for i in cur.fetchall(): 
    result = '<br><c><b>TYPE:</b> {}<br><b>DESCRIPTION:</b></c> {}' 
    print result.format(*i) 
else: 
    print '{} does not exist in the Database'.format(looking_for) 
+1

另外添加'限制1'/'top 1'将停止第一场比赛。 – threenplusone

-1

我认为这个问题是一个空白问题。

试试这个

for i in cur.fetchall(): 
    if i[0] == name: 
    print '<br>' '<c><b>TYPE'':</b>' ' '+ i[1]+ '<br>'\ 
     '<b>DESCRIPTION:</b></c>' ' '+ i[2] 
    break 
else: 
    print 'This name does no exist in the Database' 

而且,你在虚线缺少一个 '+'?

+0

谢谢你现在就试试看,我不认为我错过了一个+,最后我检查了它打印出来(为什么),但我会仔细检查。它的工作,仍然学习如何/如果循环工作,所以我觉得很哑,else语句间隔有点太远= \谢谢! –

-1

每个数据库都支持SQL'LIMIT'关键字来限制结果集的大小。 这是要循环而不是遍历可能的大型结果集的方法。所以你的方法被打破了。修复您的查询,而不是修改解决方法。当然除此之外:在您的查询中加入'姓名'。

0

由于布尔汗哈立德回答,你能做到这里面SQL,这是优选的,速度更快。但是为了完整起见,如果您想像从前那样将逻辑从SQL区域移动到Python区域,那也应该起作用。我相信你的代码中的问题是name字段不是索引0。尝试打印i[0], i[1], i[2]并检查是否属于这种情况。

现在,参考列也可以通过字段名完成的,所以你可以更改您的代码:

if i["name"] == name: 

不会对指数计算,因而具有更强大的逻辑。

相关问题