2015-02-08 2 views
0

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

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) 

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

+0

вы можете сделать это на одном дыхании, используя INSERT INTO secondtable SELECT * FROM exampletable – koriander

+0

Я хочу, чтобы скопировать одну таблицу из одной базы данных в другую базу данных, так что мне нужно 2 курсоры – user1680859

ответ

2

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

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

Это показывает мне Ошибка: Файл «C: \ Python34 \ lib \ site-packages \ pg8000 \ core.py», строка 1566, в исполнении ps = cache ['ps'] [key] KeyError: ((705,), 'INSERT INTO secondtable VALUES% s ') – user1680859

+0

да, извините, замените запятую% (см. Пересмотренный ответ) – koriander

+0

Теперь он дает: TypeError: executemany() отсутствует 1 обязательный позиционный аргумент:' param_sets ' – user1680859

0

Немного от темы, но поиск связанного с ней вопроса приводит сюда. Я хотел знать, как отформатировать связанные переменные для строки sql выполнения. Формат, указанный в ответе koriander, не работает с 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 – If paramstyle is qmark, numeric, or format, this argument should be an array of parameters to bind into the statement

Две вещи, чтобы иметь в виду:

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