将 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 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 0bf53c45398b81a29ff4b66baaac5810ce9619a5ef9e239796efbf3e1d55461d |
|
| MD5 | e5c9dbd1764d95acc5db7fd4c89400a1 |
|
| 布莱克2-256 | db4ad067944e43810a9bd4aa07b07703d318fdc2788cab15f0aaf445f32d722d |