Рекурсивная фильтрация строк в sqlite3 / python - PullRequest
0 голосов
/ 17 июня 2019

У меня есть запрос sqlite из внешнего источника, который будет иметь неизвестное количество предложений WHERE.Типов предложений будет ограничено (и я заранее знаю, какими они могут быть), но сколько из каждого типа неизвестно, пока я не получу запрос.

Я думал, что это будетлегко решить проблему, пока я на самом деле не доберусь до нее.

Я могу придумать пару возможных решений.Я мог бы указать длинный запрос SELECT с большим количеством различных предложений WHERE для каждого типа выбора и заполнить их с помощью 1=1, когда недостаточно вариантов выбора, чтобы заполнить их все.Но это ужасный код, и он плохо реагирует, когда требуется больше места, чем указано.

Вместо этого я мог бы не делать это в чистом SQL, а вместо этого использовать рекурсивную функцию Python, которая выполняет итерации по запросам и последовательнофильтрует результаты.Это psuedocode, который не подходит для успешной работы:

queries = (list of queries from external source)
return filter_results(conn.cursor(), (database), queries)

def filter_results(cursor, results, queries):
    if len(queries) == 0:
        return results_so_far
    cursor.execute("SELECT * FROM {} WHERE {}".format(results, queries.pop(0)))
    results = cursor.fetchall()
    return filter_results(cursor, results, queries)

Как вы можете заметить, я ошибся при передаче базы данных в функцию, и я хорошо знаю, что не будувозможность передать запрос SQL к результату cursor.fetchall().В какой-то момент я либо пытался эмулировать SQL в Python, либо подвергать себя SQL-инъекции.

Я либо слишком серьезно думаю об этом, либо пытаюсь решить неразрешимую проблему.Я очень подозреваю, что это первое.Какой правильный подход к этому?

1 Ответ

0 голосов
/ 18 июня 2019

Ответ - использовать инструмент построения запросов.В этом случае PyPika был правильным инструментом.

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