#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)
. Это выглядит правильно для вас?