Преобразование списка в строки, разделенные запятыми, для sql В operator

#python #mysql #postgresql

#python #mysql #postgresql

Вопрос:

Это кажется очень очевидным вариантом использования, и я удивлен, что не смог найти ни одного рабочего решения для этого.

У меня есть метод, который возвращает список имен пользователей, что-то похожее на это:

 username = ["Tom", "Bob", "Charley"]
 

Теперь я хочу использовать эту переменную для построения sql для оператора IN, что-то похожее на это:

 sql = "Select * from users Where username IN %s" % username;
 

очевидно, что вышеприведенная строка завершается ошибкой из-за синтаксической ошибки.

Затем я где-то обнаружил, что могу изменить это на tupple:

 username_tuple = tuple(username)
sql = "Select * from users Where username IN {}".format(username_tuple)
 

Приведенная выше строка работает хорошо, но если в списке есть только одна строка (username = [«tom»]), то она завершается синтаксической ошибкой, потому что username_tuple вычисляется как («tom»,) (обратите внимание на конечную запятую после имени пользователя.)

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

1. Смотрите Здесь Адаптацию списка

Ответ №1:

В конечном итоге вам нужна строка SQL, которую можно использовать в подготовленном операторе, где username список затем может быть передан в качестве аргументов. Эта строка будет выглядеть так:

 Select * from users Where username IN (%s,%s,%s)
 

и может быть динамически построен с:

 username = ["Tom", "Bob", "Charley"]
params = ','.join(['%s'] * len(username))
sql = f"Select * from users Where username IN ({params})"
 

Затем вы получите a cursor из своего соединения и выполните следующее:

 cursor.execute(sql, username)
 

Используя оператор Peepared, вам не нужно беспокоиться об экранировании каких-либо специальных символов, которые могут быть в именах пользователей, и вам не нужно беспокоиться об атаках SQL-инъекций.

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

1. Я бы посоветовал взглянуть на SQL

2. @AdrianKlaver psycopg2 подходит для PostgreSQL, но вопрос OP также помечен для MySQL.

Ответ №2:

Вместо того, чтобы изобретать велосипед, используйте встроенную адаптацию списка из psycopg2 . Адаптация списка:

 username = ["Tom", "Bob", "Charley"]
cur.execute("Select * from users Where username = ANY(%s)", [username])

 

Ответ №3:

Используйте str.join()

 sql = "Select * from users Where username IN ({})".format(str(username)[1:-1])
 

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

1. Это приводит к Select * from users Where username IN (Tom,Bob,Charley) . Это выглядит правильно для вас?