Поиск по ключевым словам с использованием Python и SQLite - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть плагин для игрового сервера, который записывает изменения, внесенные в карту. База данных содержит записи, отформатированные так: id INTEGER PRIMARY KEY, перед INTEGER, matafter INTEGER, имя VARCHAR (50), дата 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())

Ключевое слово - это ключевое слово для поиска, столбец - это столбец для поиска, а returncolumn - это возвращаемый столбец. Мне было интересно, почему этот код всегда не выбирает ни одной строки, EG - Возвращает None, независимо от того, что я добавил для функция. Кажется, это нормально работает, если я делаю эти вещи в консоли, но не если я обертываю их в функцию

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

Если 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)

0 голосов
/ 08 ноября 2010
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())
  1. Не уверен, что это должно делать.Вы имели в виду self.memwrite ()?
  2. Можно изменить на if isinstance(keyword, (int,str))

    Или, что еще лучше, не проверять тип.Как вы уже написали, ключевое слово не может быть строкой Юникода.Зачем так ограничивать?В этом случае я думаю, что было бы лучше использовать блок try...except... для перехвата последующей ошибки, чем для ограничения типа.

  3. Так что в лучшем случае len(entry) = 1.Также обратите внимание, что возможно никогда не достичь этой строки, если ключевое слово не имеет тип int или str.В этом случае вы получите сообщение об ошибке в строке (4), поскольку запись не будет определена ..
  4. Это также можно записать как

    qmarks = ' OR '.join(['?']*len(entry))
    

    Это устраняет необходимостьза несколько магическое число 4 в ("? OR " *1)[:-4].

  5. Что вы здесь видите?Если бы это было пусто, это должно было быть подсказкой.Также стоит запустить print(statement), чтобы получить полную картину того, что отправляется на .execute().

  6. Возможно, попробовать

    statement = 'SELECT {0} FROM main WHERE {1} = ?'.format(
                 returncolumn,column)
    

    В частности,is следует изменить на =.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...