Хобрук: Ваш путь к мастерству в программировании

Вставьте список python в базу данных Postgres

У меня возникли проблемы с форматированием списка для вставки с помощью psycopg. Вот пример кода, который я пытаюсь сделать. В основном я просто читаю данные из одной таблицы и пытаюсь вставить их в другую таблицу.

Код:

cur.execute("""select data from \"Table1\" where lat=-20.004189 and lon=-63.848004""")
rows = cur.fetchall()
print rows
cur.execute("""INSERT INTO \"%s\" (data) VALUES (ARRAY%s)""" % (args.tableName,rows)))

Результат, возвращаемый первым запросом выбора, выглядит следующим образом:

[([6193, 3975, 4960, 5286, 3380, 970, 3328, 3173, 2897, 2457, 2443, 2674, 2172, 2740, 3738, 4907, 3691, 4234, 3651, 3215],)]

Когда я пытаюсь вставить это в другую таблицу, я получаю следующую ошибку формата.

   cur.execute(cur.mogrify("""INSERT INTO \"%s\" (data) VALUES (%s)""" % (args.tableName,rows)))
psycopg2.ProgrammingError: syntax error at or near "["
LINE 1: INSERT INTO "DUMMY1km" (data) VALUES ([([6193, 3975, 4960, 5...

Пробовал cur.mogrify, но вроде не помогает.

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

Спасибо, Ади.


  • Данные столбца представляют собой массив, синтаксис значения недействителен, так как он уже диагностирован в этом повторяющемся вопросе. Где я не мог помочь: лучший синтаксис Python для создания правильного синтаксиса. 14.10.2011
  • Да, я просто пробовал разные способы отправки массива в качестве параметра. Это была лишь одна из попыток.! :) 14.10.2011

Ответы:


1

Я не думаю, что mogrify здесь нужен. Используйте executemany и передайте rows в качестве второго аргумента.

cur.executemany(
    """INSERT INTO "%s" (data) VALUES (%%s)""" % (args.tableName),rows)

Использование параметризованных аргументов помогает предотвратить внедрение кода SQL.

Имя таблицы не может быть параметризовано, поэтому нам нужно использовать интерполяцию строк, чтобы поместить имя таблицы в SQL-запрос. %%s получает экранирование знака процента и становится %s после интерполяции строки.


Кстати, (как уже указал a_horse_with_no_name) вы можете использовать форму INSERT INTO... SELECT INSERT для выполнения обоих SQL-запросов как одного:

cur.execute(
    """INSERT INTO %s (data)
       SELECT data FROM Table1
       WHERE lat=-20.004189 AND lon=-63.848004""" % (args.tableName))

По вопросу в комментариях, если есть несколько полей, тогда SQL становится:

cur.executemany(
    """INSERT INTO {t} (lat,lon,data1,data2) 
       VALUES (%s,%s,%s,%s)""".format(t=args.tableName),rows)

(Если вы используете метод format, вам не нужно экранировать все остальные %s.)

13.10.2011
  • Если я попытаюсь выполнить много, я получу это как ошибку: TypeError: обязательный аргумент 'vars_list' (pos 2) не найден. Кроме того, я намерен прочитать данные из файла перед вставкой. Поэтому не всегда можно комбинировать вставку и выбор 14.10.2011
  • Пожалуйста, опубликуйте точное cur.executemany заявление. А что такое vars_list? 14.10.2011
  • cur.executemany("""INSERT INTO \"%s\" (data) VALUES (%s)""" % (args.tableName,rows)) vars_list был включен в TypeError, выброшенный python 14.10.2011
  • Переместите rows за скобки. (Посмотрите, как я это написал в своем посте выше). 14.10.2011
  • Что такое несколько атрибутов в строке. Сейчас есть только данные. Но если есть широта, долгота, данные1, данные2, то как нам использовать функцию executemany? 14.10.2011
  • Новые материалы

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..

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

    Текстовый графический интерфейс с Lanterna на Java
    Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

    Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
    Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

    Основы C# — Нулевой оператор объединения (??)
    Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

    Сравнение номеров версий в C++ с использованием синтаксического анализа строк
    Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

    В мир искусственного интеллекта…
    ИИ — это новое топливо в современном мире. Куда бы вы ни обратились, с кем бы вы ни разговаривали — они, как правило, упоминают об ИИ хотя бы раз в ходе разговора. ИИ гудит повсюду. У каждого..