2015-04-22 103 views
2

我是編程和編寫作業的新手。我試圖通過將用戶的搜索詞與選定列中的任何匹配值進行比較來搜索數據庫。如果用戶搜索「Smith」並單擊我的GUI中的「Smith」單選按鈕,則應顯示包含「Smith」作爲其作者的所有記錄。我可以打印數據庫中的所有記錄,但不能打印與我的搜索相關的記錄。Python:使用SQL搜索數據庫

db = None 
colNum = None 

def search_db(self): 
    global db 
    global colNum 

    self.searchTerm = self.searchvalue.get() 
    dbname = 'books.db' 
    if os.path.exists(dbname): 
     db = sqlite3.connect(dbname) 
     cursor = db.cursor() 
     sql = 'SELECT * FROM BOOKS' 
     cursor.execute(sql) 
     rows = cursor.fetchall() 
     for record in rows: 
      sql_search = 'SELECT * FROM BOOKS WHERE' + ' ' + record[colNum] + ' ' + 'LIKE "%' + ' ' + self.searchTerm + '%"' 
      cursor.execute(sql_search) 
      searched_rows = cursor.fetchall() 
     print(searched_rows) 

我收到的錯誤是「sqlite3.OperationalError:沒有這樣的欄目:」

+4

這不是你的問題,但[你不應該用這種方式在它們的動態數據中構建SQL語句](https://xkcd.com/327/)。 – abarnert

回答

1

沒有在你的問題足夠的信息可以肯定的,但是這肯定是腥:

sql_search = 'SELECT * FROM BOOKS WHERE' + ' ' + record[colNum] + ' ' + 'LIKE "%' + ' ' + self.searchTerm + '%"' 

record[colNum]表示列的值,而不是列的名稱。例如,如果您想要的列是Title,那麼您會將每本書的每個標題看作是列名。

所以,你最終運行的查詢是這樣的:

SELECT * FROM BOOKS WHERE The Meaning of Life: The Script like %Spam% 

即使這是有效的SQL(引用正確),The Meaning of Life: The Script可能不是在BOOKS表中的列。


同時,SELECT *返回以任意順序列,因此使用colNum是不是真的保證做任何有用的。但是,如果你真的想這樣做你想要做什麼,我認爲這是這樣的:

sql = 'SELECT * FROM BOOKS' 
cursor.execute(sql) 
colName = cursor.description[colNum][0] 
sql_search = 'SELECT * FROM BOOKS WHERE ' + colName + ' LIKE "%' + ' ' + self.searchTerm + '%"' 

但是,你真的不應該想這樣做...

-1

它看起來對我來說,你只是沒有正確地形成SQL。記住,無論你在LIKE子句後面加什麼都需要引用。你的SQL需要看起來像

SELECT * FROM BOOKS WHERE Title like '%Spam%' 

所以你需要另一套單引號中就有所以這就是爲什麼我會用雙引號包圍你的Python字符串:您需要得到列

sql_search = "SELECT * FROM BOOKS WHERE " + record[colNum] + " LIKE '%" + self.searchTerm + "%'" 
+0

不正確引用通常是這些查詢錯誤的原因,但在這種情況下,這不是原因。記錄[colNum]返回一個數據字段而不是列名。 – philshem

+0

我沒有引用記錄[colNum]我將引號添加到LIKE子句中。原始代碼圍繞Python字符串使用單引號,並且圍繞SQL字符串使用雙引號。 SQL從不使用雙引號來包圍字符串常量,這就是爲什麼我將其顛倒過來的原因。當你在SQL中雙引號時,它將它作爲命名對象的標識符而不是字符串常量。 –

+0

記錄[colNum]是數據,而不是標題。 – philshem

0

名稱來自表格的字段,或來自其他地方。您的查詢使用記錄[colNum],但記錄包含數據行。相反,以獲得字段名,使用這樣的:

fields = [] 
for field in cursor.description: 
    fields.append(field[0]) 

當您使用rows = cursor.fetchall(),你只得到數據(而不是列標題)。