Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 插入到postgresql数据库时,在psycopg2中使用copy_from时出错_Python_Pandas_Postgresql_Psycopg2 - Fatal编程技术网

Python 插入到postgresql数据库时,在psycopg2中使用copy_from时出错

Python 插入到postgresql数据库时,在psycopg2中使用copy_from时出错,python,pandas,postgresql,psycopg2,Python,Pandas,Postgresql,Psycopg2,每当我想将pandas dataframe中的数据插入postgresql数据库时,就会出现以下错误 错误:上次预期的列上下文后的额外数据:复制建议,第1行:“04070,”[5963825799747546112515203102888809810119810950]” 数据帧由三列组成,第一列和第二列为整数类型,第三列为整数列表 我使用下面的函数在PostgreSQL中创建了一个表 def create_table(query: str) -> None: ""&q

每当我想将pandas dataframe中的数据插入postgresql数据库时,就会出现以下错误
错误:上次预期的列上下文后的额外数据:复制建议,第1行:“04070,”[5963825799747546112515203102888809810119810950]”

数据帧由三列组成,第一列和第二列为整数类型,第三列为整数列表

我使用下面的函数在PostgreSQL中创建了一个表

def create_table(query: str) -> None:
"""

:param query: A string of the query to create table in the database
:return: None
"""
try:
    logger.info("Creating the table in the database")
    conn = psycopg2.connect(host=HOST, dbname=DATABASE_NAME, user=USER, password=PASSWORD, port=PORT)

    cur = conn.cursor()
    cur.execute(query)
    conn.commit()
    logger.info("Successfully created a table in the database using this query {}".format(query))
    return
except (Exception, psycopg2.Error) as e:
    logger.error("An error occurred while creating a table using the query {} with exception {}".format(query, e))
finally:
    if conn is not None:
        conn.close()
        logger.info("Connection closed!")
传递到此函数的查询如下所示:

create_table_query = '''CREATE TABLE Recommendations
(id INT NOT NULL,
applicantId INT NOT NULL,
recommendation INTEGER[], 
PRIMARY KEY(id), 
CONSTRAINT applicantId
FOREIGN KEY(applicantId)
REFERENCES public."Applicant"(id)
ON DELETE CASCADE
ON UPDATE CASCADE 
); '''
然后,我使用下面的函数将数据帧复制到postgres中创建的表中

def copy_from_file(df: pd.DataFrame, table: str = "recommendations") -> None:
    """
    Here we are going save the dataframe on disk as
    a csv file, load the csv file
    and use copy_from() to copy it to the table
    """

    conn = psycopg2.connect(host=HOST, dbname=DATABASE_NAME, user=USER, password=PASSWORD, port=PORT)
    # Save the dataframe to disk
    tmp_df = "./tmp_dataframe.csv"
    df.to_csv(tmp_df, index_label='id', header=False)
    f = open(tmp_df, 'r')
    cursor = conn.cursor()
    try:
        cursor.copy_from(f, table, sep=",")
        conn.commit()
    except (Exception, psycopg2.DatabaseError) as error:
        os.remove(tmp_df)
        logger.error("Error: %s" % error)
        conn.rollback()
        cursor.close()

    logger.info("copy_from_file() done")
    cursor.close()
    os.remove(tmp_df)

然后我仍然得到了这个
错误:在上一个预期的列上下文之后的额外数据:复制建议,第1行:“04070,[5963825799747546112515203102888809810119810950]”
关于如何解决这个问题,请给出任何建议?谢谢

copy\u from
使用文本格式,而不是csv格式。您告诉它使用
作为分隔符,但这并没有改变它试图使用的保护方法。因此引号内的逗号不被视为受保护的,它们被视为字段分隔符,因此它们当然太多了


我认为您需要使用
copy\u expert
并告诉它使用
csv
格式。

您能提供csv的样本行吗?这个:
“[596382579974754611251520310288809810119810950]”看起来不对。引用似乎不正确。
04070[596382579974754611251520310288809810119810950]
@AdrianKlaver,上面是csv的一个样本“0”“是id,下一个是应用程序id,列表是要传递到数据库中“建议”列的列表。我将检查以下内容的输出:
df.to\u csv(tmp\u df,index\u label='id',header=False)
。看来它的报价并不正确。这:
“[5963825799747546112515203102888809810119810950]”
无法正常工作。是否有办法将引号从中转义以使其成为列表?不确定。该值如何存储在数据帧中?谢谢!但现在我收到此错误
错误:格式错误的数组文字:”[2837、8561、9174、103057、100075、5029、8414、102145]“详细信息:数组维度后缺少“]”。上下文:复制建议,第2行,列建议:“[2837、8561、9174、103057、100075、5029、8414、102145]”
右侧,数组的PostgreSQL语法使用{},而不是[]。既然它已经存在于数据框架中,那么如何实现这一点呢?我对熊猫不太了解。df是否知道它正在与postgresql讨论数组?您能否将列数据类型更改为文本?@RichardOgunyale如果您的列表改为集合,您将看到生成的CSV将是
{}
,而不是
[]
…不过,您可能还有一些其他问题需要解决。最后,使用类似以下内容:
“{{{}}”.format(“,”.join([““+item+””表示_列表中的项)))
…可能最适合您。这应该在调用框架上的
to_csv
方法之前完成。这样,无论您使用
,csv导出都会将其视为字符串,Postgres会将其视为格式正确的数组。”该格式字符串中的
”将取决于您从