Python & Psycopg2 |Динамический запрос с различными предложениями WHERE - PullRequest
2 голосов
/ 02 июня 2019

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

def sql_query(filter1, filter2, filter3):
    with ConnectionPool() as cursor:
        cursor.execute('''SELECT * FROM table 
        WHERE filter1 = %s AND filter2 =%s AND filter3 = %s;'''
        cursor.fetchall()

Но если любой из фильтров имеет значение None, я не хочу, чтобы этот параметр был частью SQL-запроса.

Например, если используется ТОЛЬКО фильтр 1, я бы хотел, чтобы запрос стал:

def sql_query(filter1, filter2, filter3):
    with ConnectionPool() as cursor:
        cursor.execute('''SELECT * FROM table 
        WHERE filter1 = %s;'''
        cursor.fetchall()

Как это сделать, чтобы запрос генерировался динамически?

1 Ответ

2 голосов
/ 02 июня 2019

Рассмотрим COALESCE, поскольку Python None переводит в SQL NULL.Метод ниже теперь использует необязательные аргументы, которые по умолчанию None:

def sql_query(filter1=None, filter2=None, filter3=None):
    with ConnectionPool() as cursor:
        sql = '''SELECT * FROM table 
                 WHERE filter1 = COALESCE(%s, filter1) 
                   AND filter2 = COALESCE(%s, filter2) 
                   AND filter3 = COALESCE(%s, filter3);
              '''
        cursor.execute(sql, (filter1, filter2, filter3))
        cursor.fetchall()
...