PostgreSQL с pg8000 - вставка результатов из SQL в другую таблицу

Я пытаюсь скопировать строки из таблицы PostgreSQL в другую, используя драйвер pg8000 для Python. Это код:

import pg8000
conn = pg8000.connect(user="postgres", password="XXXXX",database="test")
cursor = conn.cursor()
cursor.execute("SELECT * FROM exampletable")
results = cursor.fetchall()

Теперь я хочу полностью вставить результаты в новую таблицу. Это должно быть что-то вроде:

cursor.executemany("INSERT INTO secondtable VALUES (%s)", results)

но не работает таким образом, и я не знаю, как это исправить. Не все поля имеют строковый тип, может быть, это нужно как-то исправить?

3 ответа

Решение

Формат %s предназначен для скалярных значений. Преобразуйте результаты в строку, например так:

cursor.execute("INSERT INTO secondtable VALUES %s" % str(results))

Немного не по теме, но поиск связанного вопроса приводит здесь. Я хотел знать, как отформатировать связанные переменные для строки выполнения SQL. Формат, указанный в ответе Кориандера, не работает с pg8000 1.10.5. Вот что в итоге сработало для меня:

    some_field_value = 'value'
    sql = 'SELECT a_field FROM your_table WHERE some_field = %s'
    cursor.execute(sql, [some_field_value])

Подробности из документов: pg8000 Cursor.execute

Важный бит:

args - если paramstyle имеет тип qmark, numeric или format, этот аргумент должен быть массивом параметров, которые нужно связать в операторе

Необходимо помнить две вещи:

  1. pg8000 никогда не принимает кавычки вокруг строки формата (%s)
  2. Значение pg8000.paramstyle имеет значение. значение по умолчанию - "формат"

Это можно сделать с помощью метода выполнения курсора .

Допустим, мы хотим скопировать содержимое нашегоusersтаблицу в другую таблицу с именемusers_copy* . Нам нужно получить строки, а затем построитьINSERTоператор для выполнения.

      import pg8000

conn = pg8000.connect(user='souser', password='password', database='test')
cursor = conn.cursor()

# Fetch the data.
cursor.execute('SELECT * FROM users')
results = cursor.fetchall()

# Construct the INSERT statement, dynamically creating the correct
# number of placeholders for the VALUES clause.
placeholders = ', '.join(['%s'] * len(results[0]))
stmt = f"""INSERT INTO users_copy VALUES ({placeholders})"""

# Insert to results into the target table.
cursor.executemany(stmt, results)
conn.commit()
conn.close()

* В вопросе указано, что целевая таблица находится в другой базе данных, но нам не нужно подключаться к другой базе данных, чтобы продемонстрировать этот метод. Если целевая таблица находилась в той же базе данных, тогдаSELECT INTO,CREATE TABLE ASилиINSERTINTO ... SELECT * FROM ...можно использовать, чтобы избежать необходимости извлекать данные, как user2207101 . прокомментировал

Другие вопросы по тегам