Nano Hash - криптовалюты, майнинг, программирование

Как передать параметризованные операторы со значениями и именами таблиц в Psycopg2?

Я в основном пытаюсь выполнить то, что здесь указал ответчик: ">psycopg2 cursor.execute() с параметром запроса SQL вызывает синтаксическую ошибку

Мое утверждение:

    cursor.execute('SELECT %s FROM %s WHERE %s = %s' % (pkey,table,field, "%s"), (value))

Но когда я запускаю его, я получаю сообщение об ошибке:

---> 89         cur.execute('SELECT %s FROM %s WHERE %s = %s' % (pkey,table,field, "%s"), (value))
     90         res=cur.fetchone()
     91         if res==None:

TypeError: not all arguments converted during string formatting
08.04.2012

  • Будьте очень осторожны при этом - убедитесь, что "pkey", "table" и "field" содержат только действительный идентификатор SQL, если есть шанс, что они пришли прямо или косвенно из пользовательского ввода. Делая это, вы обходите любую защиту от SQL-инъекций, которую вы получаете от использования параметризованных операторов, поэтому вам нужно быть очень параноиком. Для PostgreSQL я бы рекомендовал заключать в двойные кавычки каждое значение в SQL и проверять значения, чтобы убедиться, что они не содержат двойных кавычек или символов \. 09.04.2012

Ответы:


1

Ваша проблема была не в цитировании, а в синтаксисе кортежа Python.

Как вы уже заметили выше, правильный способ представления одноэлементного кортежа(value,). В общем случае синтаксис кортежа (неофициально):

()
(value,)
(value, value)
(value, value, value)

и так далее для многоэлементных кортежей.

Принятый ответ на самом деле неверен, и предлагаемое в нем изменение является чисто вопросом вкуса (добавление последнего «% s» после замены по сравнению с вашей попыткой).


Имейте это в виду: при обычной подстановке строк в Python, когда у вас есть строка только с одним %s, вы можете удалить кортеж и просто передать одну строку подстановки:

'foo %s' % 'bar'

Это приведет к foo bar.

Вы можете попробовать то же самое с cursor.execute от psycopg, возможно это работает (я бы проверил это сам перед публикацией, но не могу).

08.04.2012

2

Попробуйте следующее, модуль db должен позаботиться о правильном цитировании:

sql = 'SELECT %s FROM %s WHERE %s' % (pkey, table, field) + ' = %s'
cursor.execute(sql, (value, ))
08.04.2012
  • если я добавлю , после значения в cursor.execute это сработает. так что cursor.execute (sql, (значение,)) 08.04.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..