Skip to main content

将 pandas 数据帧快速上传到 Microsoft SQL Server

项目描述

pd_to_mssql :将 pandas 数据帧快速上传到 Microsoft SQL Server


价值主张

pandas提供的令人难以置信的功能可以使ETL 任务的自动化快速而轻松,如果该任务不涉及将数据上传到 Microsoft SQL Server,因为标准to_sql功能非常缓慢。此包仅使用 pandas 和pyodbc来实现与SSIS 包SQLAlchemy + pyodbcfast_executemany=True选项相当的上传速度,同时还保持现有表结构完整(即删除目标表并使用新的列数据类型创建一个)并且只需要一行代码这样做。

pd_to_mssql 的可能替代方案

在编写此包之前,我尝试了许多其他 SQL Server 上传解决方案。以下是这些选项的简要列表以及我对它们的主要问题:

解决方案 问题
将数据帧写入 csv 并使用bcp 实用程序 bcp 无法处理出现在字段值中的定界字符,即使它被正确引用。此外,每次上传都需要在 python 之外进行太多繁琐的工作。
将数据帧写入 excel 并使用由 dtexec 实用程序启动的subprocess.run()SSIS 运行良好,但需要在部署环境中安装 sql server 实例。同样,在 python 之外进行太多繁琐的开发。
pyodbc + SQLAchemy 的fast_executemany=True选项 绝对是这些选项中最好的。应该适用于大多数人。不喜欢参数的行为if_exists='replace',但可以使用变通方法。我在尝试上传一些超大数据帧(超过 100 万行,10 多列)时遇到了一些内存问题,这阻止了这成为我的首选解决方案(不,我没有使用旧的“SQL Server”odbc 驱动程序)。

如何安装 pd_to_mssql

pip install pd_to_mssql

依赖项

如何使用 pd_to_mssql

from pd_to_mssql import to_sql
to_sql(df_in, table_name, cnxn_string, schema='dbo', index=True, replace=False, chunk_size=1000, thread_count=5, ignore_truncation=False, ignore_missing=False)
范围 必需/默认值 描述
df_in 要求 将上传到 SQL Server 的数据框。
表名 必需的 上传目的地。仅指定表名。不包括架构。
cnxn_string 必需的 ODBC 连接字符串。请参阅此处了解更多信息。
图式 'dbo' 如果需要,请指定目标表的架构。
指数 真的 将索引上传到目标表。仅当索引名称与目标表中的列匹配时才会包括在内。
代替 错误的 在上传包含在 df_in 中的数据之前截断目标表
块大小 1000 每个插入语句中包含的行数。1000是 MS SQL Server 允许的最大行数。
线程数 5 为插入而建立的并发连接数。只要连接延迟是主要瓶颈,增加此值将加快性能。
忽略截断 错误的 当上传的字符串值超过目标列所允许的字符数时,忽略字符串截断。这是通过设置来完成的ANSI_WARNINGS OFF
忽略缺失 错误的 而不是提高 a MissingColumnsException,而是尝试将空值插入该列。

pd_to_mssql 的工作原理

首先,数据框中包含的所有数据都被字符串化以适应插入语句的创建。然后根据thread_count参数生成多个线程(来自线程模块)。然后,每个线程都接收一个单独的 pyodbc 连接。在每个连接中创建一个临时表,同时插入到每个临时表中。在所有线程上完成临时表插入后,临时表将被一一卸载到目标表中。仅当所有临时表插入成功完成时,才完成最后一步。

列映射

对于目标表中的每个非标识列,提供的数据框中必须存在同名的列,但数据框中这些列的数据类型无关紧要,因为它们将根据列规范。如果提供的数据框中不存在该列,则将引发 MissingColumnsException ,除非ignore_missing=True,在这种情况下,如果该列可以为空,则将空值插入该列。

调试

有些错误会通过初始验证检查,并且只有在生成插入语句后才会被捕获。因此,生成的 SQLExcetions 通常包含非常少的用于识别问题的有用信息。为了帮助调试,每个线程中第一个失败的插入语句将被写入磁盘中的一个目录中,该目录__pd_to_mssql_exception位于上载时位于当前工作目录中的目录中。从那里,您将能够在 SSMS 中运行这些脚本,以轻松识别它们失败的位置和原因。根据我的经验,进入此阶段的最常见问题源于无效的数据转换。EG 无法识别的数据格式字符串表示(上传前转换为 Datetime.Date(time))或字符串列,其中包含带有少数非数字字符实例的数字数据。

杂项说明

  • 只有在没有错误的情况下才会将插入提交到数据库。如果抛出 SQLException,则不会向目标数据库插入任何行。
  • 如果replace=True则只有在临时表插入过程中没有错误时才会发生表截断。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

pd_to_mssql-0.2.1.tar.gz (7.2 kB 查看哈希

已上传 source