2015-04-22 2 views
2

Я новичок в программировании и работе над домашним заданием. Я пытаюсь выполнить поиск базы данных, сравнивая условия поиска пользователя с любыми соответствующими значениями из выбранного столбца. Если пользователь ищет «Смит» и нажимает на переключатель «Смит» в моем графическом интерфейсе, все записи, содержащие «Смит» в качестве его автора, должны появиться. Я могу распечатать все записи в базе данных, но не записи, относящиеся к моему поиску.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] - данные, нет head. – philshem

0

Вы должны получить столбец имя из полей таблицы или из другого места. В вашем запросе используется запись [colNum], но запись содержит строки данных. Вместо того, чтобы получить имена полей, использовать что-то вроде этого:

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

При использовании rows = cursor.fetchall(), вы только получаете данные (а не заголовки столбцов).

Смежные вопросы