Python добавляет конечную запятую в конец кортежа программно

#python #mysql

#python #mysql

Вопрос:

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

 def build_search_query(user_list, make, model, price_min, price_max):
    sql = """SELECT * FROM mycolumn WHERE user_id = %s, """   
    for i, d in enumerate(user_list):        
        if not i == 0: #skip first user because its already in sql
            next_user = "OR user_id = %s, "
            sql  = next_user
    age_str = "AND age = %s, "
    height_str = "AND height = %s, "
    price_min_str = "AND price > %s, "
    price_max_str = "AND price < %s "
    sql  = age_str
    sql  = height_str
    sql  = price_min_str
    sql  = price_max_str
    tuple1 = tuple(user_list)    
    tuple2 = (age, height, price_min, price_max,)
    values = tuple1   tuple2 #this is where I need the trailing comma
    return sql, values
  

Комментарии:

1. Вы не можете сказать кортежу «эй, у вас должна быть конечная запятая, когда я вас печатаю». Объект tuple не знает логики, используемой для превращения его в строку. Возможно, вы сможете поработать со строковым представлением в том месте вашего кода, где вы преобразуете кортеж в строку, но то, как это может быть сделано, зависит от того, как вы это делаете. форматирование в процентном стиле? str.format? f строк? Это неясно, поскольку мы не знаем, как build_search_query вызывается или что происходит с возвращаемыми значениями.

2. В любом случае, каждая библиотека базы данных, которую стоит использовать, имеет свои собственные методы параматериализации, которые намного лучше предотвращают атаки SQL-инъекций, чем все, что мы, нормальные люди, могли бы написать. Вы почти никогда не должны вставлять значения в запросы самостоятельно.

3. Синтаксис не имеет никакого отношения к тому, как кортеж фактически анализируется как строка во время выполнения. Вы не можете достичь того, на что претендуете. Лучшей идеей было бы обработать кортеж с помощью генератора, чтобы вернуть значения, отформатированные по вашему желанию. Кроме того, если вы просто пытаетесь написать некоторый SQL на Python, возможно, вам следует взглянуть на некоторые библиотеки, которые помогут вам упростить процесс и избежать SQL-инъекций и других рисков, это лучше, чем изобретать велосипед: github.com/kayak/pypika

Ответ №1:

Вкратце, вы не можете. Значение является внутренним представлением кортежа. Как таковой, в нем нет круглых скобок и запятых: это просто удобства для чтения человеком.

По определению, у кортежа нет этой конечной запятой. Поскольку вы возвращаете значение, а не изображение для печати (строковое представление для вывода), я не совсем уверен, куда вас вести отсюда.

Ответ №2:

Я просмотрел ваш код и при выборе чего-либо при любом условии в SQL после первого условия запятая не требуется только AND вот так

 SELECT * FROM mycolumn WHERE user_id = %s

age_str = " AND age = {}".format(something)