#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) Ошибка типа: не все аргументы преобразуются при форматировании строки