Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2022, 21:21   #1
HDService
Пользователь
 
Регистрация: 03.12.2021
Сообщений: 12
Вопрос динамический SQL-запрос из Python

Здравия желаю, коллеги!

Прошу подсказать в каком копать направлении.

Имеется:
- html-форма с несколькими полями (н/р: name, age)
- база данных (таблица user содержит колонки id, name, age)
- flask

Из формы во flask я получаю значения полей в одноименные переменные.

Дальше необходимо сформировать запрос в SQL и вернуть данные, типа вот так:

Код:
def get_data(conn, name, age):
    c = conn.cursor()
    c.execute(f"SELECT * FROM users WHERE name={name} AND age={age}")
    res = c.fetchall()
    return res
Но!
А что если не заполнено ни одно поле в форме - результатом поиска мы хотели бы возвращать все данные (без условия WHERE)
А что если будет заполнено только одно поле для поиска? Н/р, выбрать всех кому 35 лет. Тогда WHERE должен включать только age...

Коллеги, Как составить динамический (в части WHERE) запрос в SQL?

Извращения с проверками типа if request.form['age'] != : конкатенировать строки запроса'' мне кажется совершенно не удачным, особенно когда у тебя не 2, а 10 полей для поиска.

Ребята, очень надеюсь на Вашу помощь-консультацию! Спасибо!

Последний раз редактировалось HDService; 04.05.2022 в 21:23.
HDService вне форума Ответить с цитированием
Старый 04.05.2022, 22:29   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не знаю, есть ли специальные возможности для этого, но вполне лаконично получается с помощью стандартных возможностей питона:
Код:
def get_data(conn, **kwargs):
    '''
    c = conn.cursor()
    c.execute(f"SELECT * FROM users WHERE name={name} AND age={age}")
    res = c.fetchall()
    return res
    '''
    filtered_fields = {k: v for k, v in kwargs.items() if v != ''}
    query = "SELECT * FROM users"
    if filtered_fields:
        query += " WHERE " + " AND ".join([k + "=" + v for k, v in filtered_fields.items()])
    print(query)

get_data("conn")
get_data("conn", name = "Test")
get_data("conn", name = "", age = "33")
get_data("conn", name = "Test", age = "33")
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.05.2022, 16:14   #3
HDService
Пользователь
 
Регистрация: 03.12.2021
Сообщений: 12
По умолчанию

BDA, Да, мои компетенции очевидно слабоваты!

Но ОГРОМНОЕ СПАСИБО! Благодаря Вам я изучил новый материал про *args и **kwargs...

... не понимаю, как я это мог упустить из виду!

Еще раз Спасибо!
HDService вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический запрос lutdan SQL, базы данных 1 28.07.2015 00:24
Динамический запрос Ximer БД в Delphi 0 09.05.2012 13:47
динамический запрос маГГ85 JavaScript, Ajax 3 15.01.2012 22:56
Динамический запрос span4 SQL, базы данных 13 30.05.2009 02:13
Динамический запрос kaizer131 Microsoft Office Access 6 03.04.2009 22:23