Как объединить результаты двух запросов в SQLite3 для Python? - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь сделать несколько функций поиска для пользователя, и хотел бы знать, как объединить их результаты.

Я попробовал «очевидный» способ сделать это, а именно использовать

cursor.execute("UNION")

между двумя методами.Но это не сработало и привело к следующей ошибке:

Traceback (most recent call last):
  File "C:\T3AJM\T3_AJM_fn.py", line 188, in <module>
    welcome_menu()
  File "C:\T3AJM\T3_AJM_fn.py", line 119, in welcome_menu
    file_server.master_search(answer[0])
  File "C:\T3AJM\T3_AJM_fn.py", line 51, in master_search
    cursor.execute("UNION")
sqlite3.OperationalError: near "UNION": syntax error

Я хочу иметь возможность сделать что-то вроде:

search_file_name(search)
cursor.execute("UNION")
search_by_extension(search)

И объединить два результата.

Методы будут выглядеть примерно так:

def search_file_name(self, searched_file_name):
    """
    Searches
    """
    cursor.execute("""SELECT * FROM files
    WHERE file_name LIKE ?""", ('%' + searched_file_name + '%',))

и

def search_by_extension(self, extension):
    cursor.execute("""SELECT * FROM files
    WHERE extension LIKE ?""", ('%' + extension + '%',))

Я знаю, что технически я могу сделать это, используя флаг multi в команде execute, и вручную скопироватьстроки из обоих методов в один, но я хочу иметь возможность делать это для любого количества методов поиска, и не нужно делать это каждый раз.

Спасибо за ваше время.

1 Ответ

1 голос
/ 17 июня 2019

cursor.execute() не выполняет пакетную обработку.Он принимает один полный SQL-оператор и выполняет его.Одинокий "UNION" - это не полный оператор SQL, это синтаксическая ошибка.

Это будет работать.

cursor.execute("""
SELECT stuff FROM table1 WHERE something = 'this_value'
UNION
SELECT stuff FROM table2 WHERE something_else = 'that_value'
""")

Но комбинирование нескольких результатов запроса в Python напрямую также будет работать, в зависимости отчто вы делаете


Так что для вашего случая это будет один путь (одно утверждение через UNION):

# Avoid SELECT *. Spell out the columns you're selecting.

cursor.execute("""
SELECT path, name, extension FROM files WHERE file_name LIKE ?1
UNION
SELECT path, name, extension FROM files WHERE extension LIKE ?1
""", ('%' + extension + '%',))

И это будет другой (объедините потом):

from itertools import chain

def search_file_name(self, searched_file_name):
    return cursor.execute("""
    SELECT path, name, extension FROM files WHERE file_name LIKE ?1
    """, ('%' + searched_file_name + '%',))

def search_by_extension(self, extension):
    return cursor.execute("""
    SELECT path, name, extension FROM files WHERE extension LIKE ?1
    """, ('%' + extension + '%',))

def search_combined(self, criteria):
    return chain(
        self.search_file_name(self, criteria),
        self.search_by_extension(self, criteria)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...