Динамическое связывание на WHERE для строки запроса на SQL Python - PullRequest
0 голосов
/ 26 июня 2019

Моя строка запроса в dict используется для фильтрации данных в предложении WHERE.

parameters = 
{
    "manufacuturerId": "1",
    "fileName": "abc1234 ",
    "categoryName": "normal"
}

И запрос SQL в виде:

fileSql = "select * from file_table as a 
           left join category_table as b 
               on a.fId = b.fId
           left join manufacturer_table as c
               on c.mId = a.mId
           where c.manufacturerId = %(manufacturerId)s and 
               a.file_name = %(fileName)s and 
               b.name = %(categoryName)s ;"

cursor.execute(fileSql,(parameters))

Это хорошо работает для привязки значения dict к SQLзапрос на основе ключа с использованием параметризованных запросов.

Но этот способ не будет гибким, если моя строка запроса изменится на

{
    "manufacuturerId": "1",
    "fileName": "abc1234 "
}

Тогда код умрет.

Единственный manufacuturerId является обязательным, а пара ключ-значение для других необязательна для дальнейшей фильтрации.

Как оптимизировать код?

1 Ответ

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

Простой очевидный ответ - динамически построить запрос, то есть:

fileSql = """
    select * from file_table as a 
           left join category_table as b on a.fId = b.fId
           left join manufacturer_table as c on c.mId = a.mId
           where c.manufacturerId = %(manufacturerId)s 
    """

if  "fileName" in parameters:
    fileSql += " and a.file_name = %(fileName)s "
if "categoryName" in parameters:
    fileSql += " and b.name = %(categoryName)s "

Обратите внимание, что это все еще не оптимально, поскольку мы сохраняем соединение на category_table, даже когда оно нам не нужно. Это можно решить аналогичным образом, динамически создавая также и предложение "from", и это нормально, если в вашем проекте есть только пара таких случаев - но чаще всего приложениям для работы с базами данных требуется много динамических запросов и сборка их. вручную использование простых строк быстро становится утомительным и подверженным ошибкам, поэтому вы можете проверить, что ORM (Peewee приходит на ум) может сделать для вас.

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