#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)