SQL-запросы на Python с использованием переменных

#python #python-3.x #vertica

#python #python-3.x #vertica

Вопрос:

У меня есть список идентификаторов

 L1=['A1','A14','B43']
  

Я пытаюсь использовать SQL-скрипт для извлечения информации из таблицы, идентификатор которой находится в приведенном выше списке.

 sqlquery= "select * from table where ID in "   L1
cur.execute(sqlquery)
  

Я подключился к vertica с помощью vertica_python и sqlalchemy_vertica. Но я не уверен, как включить мою переменную (список L1) в sql-запрос.

 Updated Code:
data = ['A1', 'A14', 'B43', ...]
placeholders = ','.join('?' * len(data))  # this gives you e.g. '?,?,?'
sqlquery = 'SELECT * FROM table WHERE id IN (%s)' % placeholders
cur.execute(sqlquery, tuple(data))
  

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

1. data в моем примере это то, что было L1 в вашем исходном коде.

2. Да, я понял это.

3. передача данных cur.execute() во второй параметр отправляет данные, которые будут использоваться для заполнителей, поэтому вам вообще не нужно помещать данные в сам sql-запрос.

4. Спасибо, но теперь я имею дело с: ошибки raise. Ошибка запроса.from_error_response(self._message, операция) vertica_python.errors.VerticaSyntaxError: Серьезность: ошибка b ‘ERROR’, Сообщение: ошибка b ‘Syn Tax на уровне или вблизи «,»‘

Ответ №1:

Документы по https://github.com/vertica/vertica-python показывает, что реализация Vertica DBAPI использует ? для позиционных заполнителей, поэтому вы можете использовать параметризованный запрос.

К сожалению, списки не могут быть переданы правильно и требуют одного параметра для каждого элемента, поэтому вам нужно генерировать эту часть динамически:

 data = ['A1', 'A14', 'B43', ...]
placeholders = ','.join('?' * len(data))  # this gives you e.g. '?,?,?'
sqlquery = 'SELECT * FROM table WHERE id IN (%s)' % placeholders
cur.execute(sqlquery, data)
  

Но вы по-прежнему сохраняете данные и SQL отдельно таким образом, поэтому нет риска SQL-инъекции!

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

1. Я получаю эту ошибку: не все аргументы преобразованы при форматировании строки

2. Пробовал снова и снова. Я получаю ту же ошибку: operation = operation % tuple(tlist) Ошибка типа: не все аргументы преобразуются при форматировании строки

3. Почему вы преобразуете его в кортеж? placehoders является строкой и должна оставаться таковой.

4. О, при его выполнении происходит сбой. Попробуйте cur.execute(sqlquery, tuple(data)) , если ему не нравится получать список.

5. Извините, что беспокою вас, но он все еще показывает ошибку: operation = operation % tuple(tlist) Ошибка типа: не все аргументы преобразуются при форматировании строки