将大型 pandas 数据帧发送到 SQL 数据库的最佳方法?

Best method for sending large pandas dataframe to SQL database?

我有一个 pandas 数据框,它有 10 列和 1000 万行。

我在 pgadmin4(一个管理 MSSQL 服务器等数据库的应用程序)中创建了一个空的 table 来存储这些数据。

但是,当 运行 执行以下命令时:

my_dataframe.to_sql('name_of_sql_table',connection, index = False, if_exists = 'append', method="multi") 

运行 需要很长时间,而且由于进程 long/runs 内存不足,我的 jupyter 内核经常崩溃。

有什么可取的方法可以加快 "sending pandas to sql table" 的速度吗?

我能想到的一些事情是将数据拆分成 100 万行块,然后一次发送一个 - 在 运行 to_sql() 方法中附加行。

我没有直接将数据加载到 pgadmin4 的选项 - 我唯一的方法是将数据从 python 发送到 pgadmin。

看看https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

如果这适用于您的 pandas 版本,请使用

df.to_sql("table_name", 
          connection, 
          index=False, 
          if_exists='append',
          chunksize=25000,
          method=None)

您的查询可能会崩溃,因为您正在使用 method='multi',因为这会执行以下操作:

method : {None, ‘multi’, callable}, default None

Controls the SQL insertion clause used:

‘multi’: Pass multiple values in a single INSERT clause. callable with signature (pd_table, conn, keys, data_iter). Details and a sample callable implementation can be found in the section insert method.

这意味着 pandas 将在内存中为 所有行 构造语句。每行使用 chunksize 和一个 INSERT 语句将允许 pandas 将保存分块到数据库。

我也遇到了这个问题,但我没有使用 method='multi' 并且在使用 chunksize=1000 时它崩溃并出现以下错误。

ProgrammingError("(pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]传入的请求有太多参数较多,服务器最多支持2100个参数,减少参数个数,重新发送请求。(8003) (SQLExecDirectW)')",),

所以,我将我的列数除以 2100,并使用 150 作为块大小。如果有更好的方法请告诉我。