2012-12-16 16 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: 

不會對指數計算,因而具有更強大的邏輯。

相關問題