使用psycopg2批量插入数据框(错误:'dict'对象不支持索引)。

问题描述 投票:1回答:1

非常感谢,对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')

我从except子句得到的输出结果如下。

'dict' object does not support indexing

任何帮助都非常感激,我不知道这里的问题是什么。

先谢谢你

python pandas postgresql psycopg2
1个回答
0
投票

这似乎是一个无益的错误信息的案例。引用另一篇文章的内容 所以回答:

你必须给 %% 以此作为 % 因为 % 在python中被用作字符串格式化,所以当你写单个的 % 其假设你要用这个来代替一些值。

所以,当你想把单个 % 在有疑问的字符串中,总是放置双倍 %.

试试下面的代码,它取代了 %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)

0
投票

或者,你也可以使用 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')

在制作之前先玩玩这个... ...

© www.soinside.com 2019 - 2024. All rights reserved.