将数据帧写入 Postgres 数据库 psycopg2

Writing dataframe to Postgres database psycopg2

我正在尝试将 pandas DataFrame 写入 Postgres 数据库。

代码如下:

dbConnection = psycopg2.connect(user = "user1", password = "user1", host = "localhost", port = "5432", database = "postgres")
dbConnection.set_isolation_level(0)
dbCursor = dbConnection.cursor()
dbCursor.execute("DROP DATABASE IF EXISTS FiguresUSA")
dbCursor.execute("CREATE DATABASE FiguresUSA")
dbCursor.execute("DROP TABLE IF EXISTS FiguresUSAByState")
dbCursor.execute("CREATE TABLE FiguresUSAByState(Index integer PRIMARY KEY, Province_State VARCHAR(50), NumberByState integer)"); 

for i in data_pandas.index:
    query = """
    INSERT into FiguresUSAByState(column1, column2, column3) values('%s',%s,%i);
    """ % (data_pandas['Index'], data_pandas['Province_State'], data_pandas['NumberByState'])

dbCursor.execute(query)

当我 运行 这样做时,我收到一条错误消息:“索引”。我知道它在我的 for 循环中的某处是问题所在,% 表示法是否正确?我是 Postgres 的新手,看不出这怎么可能是正确的语法。我知道我可以使用 to_sql 但我正在尝试使用不同的技术。

打印出来的data_pandas如下:

一个可能的小异常是 IDE 版本中有一个“索引”。这可能是问题所在吗?

如果您使用 pd.DataFrame.to_sql,您可以提供 index_label 参数以将其用作列。

data_pandas.to_sql('FiguresUSAByState', con=dbConnection, index_label='Index')

如果您希望坚持使用自定义 SQL 和 for 循环,您需要先 reset_index

for row in data_pandas.reset_index().to_dict('rows'):
    query = """
    INSERT into FiguresUSAByState(index, Province_State, NumberByState) values(%i, '%s', %i);
    """ % (row['index'], row['Province_State'], row['NumberByState'])

请注意,新列的默认名称是 index,未大写,而不是 Index

在插入语句中:

query = """
        INSERT into FiguresUSAByState (column1, column2, column3) values ​​('%s',%s,%i);
        """% (data_pandas ['Index'], data_pandas ['Province_State'], data_pandas ['NumberByState'])

您有一个“%s”,我认为这是问题所在。所以去掉引号