Массовая вставка кадра данных с использованием psycopg2 (ошибка: объект dict не поддерживает индексацию) - PullRequest
1 голос
/ 29 апреля 2020

Заранее большое спасибо, относительно новое для psycopg2.

Я пытаюсь массово вставить данные в виде pandas кадра данных в мою существующую базу данных postgres.

try:
    psycopg2.extras.execute_values(
                cur=cur,
                sql=sql.SQL("""
                INSERT into {table_name} ( {columns} )
                VALUES %s
                """).format(table_name=Identifier(entity),
                            columns=SQL(', ').join(map(Identifier, column_names))
                            ),
                argslist=dataframe,
                template=None,
                page_size=500)

except Exception as error:
    print(ERROR: ' + error)

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

string index out of range

Я попытался изменить фрейм данных на dict, используя:

dataframe = dataframe.to_dict(orient='records')

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

'dict' object does not support indexing

Любая помощь очень ценится, я не уверен, что проблема здесь.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

В качестве альтернативы, вы можете использовать pandas .to_ sql:

from sqlalchemy import create_engine
engine = create_engine('"postgresql://postgres:postgres@localhost/postgres"', echo=False)

df.to_sql('table_name', con=engine, if_exists='append')

Поэкспериментируйте с этим, прежде чем попробовать его в работе ...

0 голосов
/ 29 апреля 2020

Это похоже на случай бесполезного сообщения об ошибке. Цитирование из другого ответа SO :

Вы должны указать %%, чтобы использовать его как %, потому что % в python используется как форматирование строки, поэтому когда вы пишете single %, предполагается, что вы собираетесь заменить какое-то значение этим.

Поэтому, когда вы хотите поместить один % в строку с запросом, всегда ставьте double %.

Попробуйте следующий код, который заменяет %s на %%s.

try:
    psycopg2.extras.execute_values(
                cur=cur,
                sql=sql.SQL("""
                INSERT into {table_name} ( {columns} )
                VALUES %%s
                """).format(table_name=Identifier(entity),
                            columns=SQL(', ').join(map(Identifier, column_names))
                            ),
                argslist=dataframe,
                template=None,
                page_size=500)

except Exception as error:
    print(ERROR: ' + error)
...