首页 > 解决方案 > 从 SQL 服务器获取百万条记录并保存到 pandas 数据框

问题描述

我正在尝试从 SQL 服务器数据库中获取数据(只是一个简单的SELECT * 查询)。

该表包含大约 3-5 百万条记录。直接使用 SSMS 在 SQL 服务器上执行 SELECT * 大约需要 11-15 分钟。

但是,当我通过 Python 连接并尝试将数据保存到 pandas 数据框中时,它需要很长时间。1个多小时。

这是我正在使用的代码:

import pymssql
import pandas as pd

startTime = datetime.now()

## instance a python db connection object- same form as psycopg2/python-mysql drivers also

conn = pymssql.connect(server=r"xyz", database = "abc", user="user",password="pwd")  
print ('Connecting to DB: ',datetime.now() - startTime )


stmt = "SELECT * FROM BIG_TABLE;"
# Excute Query here
df_big_table = pd.read_sql(stmt,conn)

必须有办法以更好的方式做到这一点?也许并行处理或快速获取数据的东西。

我的最终目标是将此表从 SQL 服务器迁移到 PostGres。

这就是我正在做的方式:

  1. 使用 python 从 SQL Server 获取数据
  2. 将其保存到熊猫数据框
  3. 将此数据以 CSV 格式保存到磁盘。
  4. 将 CSV 从磁盘复制到 Postgres。

很可能,我可以结合步骤 3,4,以便我可以在内存中进行转换,而不是使用磁盘 IO。

有许多复杂性,例如表约束和定义等。我稍后会注意。我不能使用第三方工具。

我被困在第 1,2 步。因此,对于 Python 脚本/其他一些开源语言的帮助将不胜感激。

如果还有其他方法可以达到我的最终目标,我欢迎提出建议!

标签: pythonsql-serverpandas

解决方案


您是否尝试过使用 pandas.read_sql 的“chunksize”选项?您可以将所有这些内容放入一个数据框中并生成 csv。

如果需要更多时间,则可以使用 pandas.read_sql 作为迭代器将每个块拆分为多个文件,然后在完成工作后将这些文件合并为一个文件并将其提交给 postgres。


推荐阅读