Python 插入到postgresql数据库时,在psycopg2中使用copy_from时出错
每当我想将pandas dataframe中的数据插入postgresql数据库时,就会出现以下错误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
错误:上次预期的列上下文后的额外数据:复制建议,第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会将其视为格式正确的数组。”该格式字符串中的
或
”将取决于您从