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

pd-to-mssql的Python项目详细描述


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


价值主张

pandas提供的令人难以置信的功能可以使自动化ETL tasks快速而轻松,如果该任务不涉及将数据上载到Microsoft SQL Server,就像标准的to_sql功能是painfully slow。这个包只使用pandas和pyodbc来获得与SSIS packagesSQLAlchemy+pyodbc的fast_executemany=True选项相当的上传速度,同时还保持现有表结构的完整性(即删除目标表并用新的列数据类型创建一个表),并且只需要一行代码即可完成此操作。在

pd_到_mssql

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

SolutionIssue
Writing dataframes to csv and using the bcp utilitybcp cannot handle the delimiting character appearing within a field value, even if it is properly quoted. Also, too much tedious work outside of python is required for each upload.
Writing dataframes to excel and using SSIS packages launched by ^{} and the dtexec utilityWorks well, but requries a sql server instance to be installed in the deployment environment. Again, way too much tedious developement outside of python.
pyodbc + SQLAchemy's ^{} optionDefinitely the best of these options. Should work for most people. Not a fan of the behavior of the ^{} parameter, but workarounds are available. I ran into some memory issues while attempting to upload some expetionally large dataframes (1 million+ rows, 10+ columns), which prevented this from becoming my go-to solution (and no, I was not using the old "SQL Server" odbc driver).

如何将pd安装到\u mssql

pip install pd_to_mssql

依赖性

如何使用pd_to_mssql

frompd_to_mssqlimportto_sqlto_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)
^{tb2}$

pd-to-mssql如何工作

首先,将dataframe中包含的所有数据进行字符串化,以适应insert语句的创建。然后,根据thread_count参数生成多个线程(来自线程模块)。然后,每个线程都会接收一个单独的pyodbc连接。在每个连接中创建一个临时表,并并发地插入到每个临时表中。一旦temp表的所有线程都被卸载到一个表中。只有当所有临时表插入成功完成时,最后一步才完成。在

列映射

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

调试

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

其他注释

  • 任何字符串中包含的所有换行符都将在上载之前转换为\\n。要在再次下载时恢复换行符,只需将\\n值替换为\n。一、 E.df['string_column'] = df['string_column'].apply(lambda x: str(x).replace('\\n', '\n')
  • 只有在没有错误的情况下,插入才会提交给数据库。如果抛出了SQLException,则不会向目标数据库中插入任何行。在
  • 如果replace=True则只有在临时表插入过程中没有错误时才会发生表截断。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么会出现这些错误?表达式的非法开始   使用HttpUrlConnection的java测试URL仅适用于前面的www   在大数据集上使用kmeans的java堆外内存   查找Java RandomAccessFile如何以字符形式读取第n个字节   java Android从BroadcastReceiver获取标题和描述   java使用构造函数参数模拟嵌套类并测试方法   正在将Azure Blob项强制转换为Java文件对象   java并行运行testNG套件   java程序在运行时似乎没有进入   贬低Java规则引擎的优点和缺点   文本区域中的java中心文本   java JPA从多个表中选择错误   类Java问题使用类加载器重新加载代码   java如何在Spring非管理类上使用@Value   java(关闭)Gradle导入VS代码失败   java arraylist拆分(“空白”)并计算字数   Android/Java如何在单独的*中调用函数。java文件?   具有基本身份验证的java Apache Camel RSS模块   java为什么程序在出现溢出或下溢时不抛出异常