Python 将批量数据从df插入postgresql时出现语法错误

Python 将批量数据从df插入postgresql时出现语法错误,python,postgresql,Python,Postgresql,我正在尝试将数据帧数据大容量插入Postgresql在熊猫数据框架中我有35列,在Postgresql表中我有45列。我正在从pandas dataframe中选择12个匹配列并插入到postgresql表中。为此,我使用以下代码段: df = pd.read_excel(raw_file_path,sheet_name = 'Sheet1',usecols=col_names) <---col_names = list of desired columns (12 columns) co

我正在尝试将数据帧数据大容量插入Postgresql在熊猫数据框架中我有35列,在Postgresql表中我有45列。我正在从pandas dataframe中选择12个匹配列并插入到postgresql表中。为此,我使用以下代码段:

df = pd.read_excel(raw_file_path,sheet_name = 'Sheet1',usecols=col_names) <---col_names = list of desired columns (12 columns)
cols = ','.join(list(df.columns))
tuples = [tuple(x) for x in df.to_numpy()]
query = "INSERT INTO {0}.{1} ({2}) VALUES (%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s);".format(schema_name,table_name,cols)
curr = conn.cursor()
try:
    curr.executemany(query,tuples)
    conn.commit()
    curr.close()
except (Exception, psycopg2.DatabaseError) as error:
    print("Error: %s" % error)
    conn.rollback()
    curr.close()
    return 1
finally:
    if conn is not None:
        conn.close()
        print('Database connection closed.')
即使我使用
代替
%%s
我仍然会收到此错误

有人能解释一下吗


另外,我正在使用Postgresql版本10。

您现在所做的实际上是一次插入一行数据帧。即使这样做有效,这将是一个极其缓慢的操作。同时,如果数据可能包含字符串,只需将它们放入这样的查询字符串中,就可以进行SQL注入

我不会重新发明轮子。Pandas有一个函数,用于获取数据帧并将其转换为查询。您可以指定如何处理冲突(当行已存在时)

它与,它对PostgreSQL有极好的支持。即使它可能是一个需要探索和安装的新软件包,您也不需要在其他任何地方使用它来实现这一点

从sqlalchemy导入创建引擎
引擎=创建引擎('postgresql://localhost:5432/mydatabase')
pd.read_excel(
原始文件路径,
图纸名称='Sheet1',

usecols=col_names#%s将从python变量中获取字符串值。您想对这些%s做什么?您已经将变量与{0}一起放入字符串中等等。你想传递%s还是在那里放一些值?@Anton:我想传递%s,即行值作为元组到数据库中。目标是批量插入。或者即使我使用查询字符串,如
“insert into{0}.{1}({2})”。格式(模式名,表名,cols)+“values(?,,…)”
,我也会得到同样的错误。很好地放{3}{4} 等如果你想要更多的参数,我认为最好不要在一行上混合两个语法为什么要将
%
加倍?@parafit:我看到某处使用%%s。因此使用。这很好。但是,我正在寻找更传统和通用的方法。你能解释一下“传统”是什么意思吗?我认为这和它得到的一样通用。实际插入发生在哪里?在函数内部,它由pandas处理。请参阅我链接的文档中的示例:他们调用函数,然后
选择
,并查看结果已插入Hanks Ruben!这很有效。有点奇怪。使用时如何关闭连接
创建引擎
SyntaxError: syntax error at or near "%"
LINE 1: ...it,purchase_group,indenter_name,wbs_code) VALUES (%s,%s,%s,%...