带有SQLAlchemy和PSQL的Pandas to_sql永远不会完成

时间:2016-10-18 23:42:41

标签: python-3.x pandas sqlalchemy

无论出于何种原因,我都可以使用pandas read_sql方法轻松地从postgres数据库中读取数据,但即使使用完全相同的参数df.to_sql也无效。该操作似乎已经开始,但它永远不会完成。 (我试过等了大约10分钟。)df本身只有大约5万行和20列。这就是我一直在做的事情:

from sqlalchemy import create_engine
from getpass import getpass

p = getpass("Input password")
in_string ='postgresql://<USER>:{}@<SERVER>:5432/<DB>'.format(p)
engine = create_engine(in_string)

df.reset_index().to_sql('<TABLE_NAME>', engine, schema='<SCHEMA>', index=False, chunksize=500)

另一个有趣的消息是在数据库中创建了一个新表 ,它没有填充任何数据。列名和数据类型似乎都是正确的。

我尝试过改变chunksizes,重新索引,等待。这也非常令人沮丧,因为没有错误。有没有其他人遇到过pandas to_sql这个问题?可能导致此问题的任何想法?

编辑: 发布后几分钟,它结束了。总的来说,我认为它花了大约20分钟,尽管有index=False参数,索引仍然作为一个列传递。问题仍然存在。我认为这很慢,因为引擎盖下的熊猫单独插入每一行?我可以在python中使用更快的替代方案吗?

EDIT2: 我以前应该说过这个。我正在尝试编写一个脚本来迭代csv文件列表(大约20个)并将它们“复制”到psql数据库中不存在的表中。关于pandas的好处是,它将以智能方式推断dtypes并将其转换为sql的奥术(至少对我而言)数据类型,创建表,然后插入数据。

1 个答案:

答案 0 :(得分:0)

在花了很多时间首先尝试编写实现csv kit的bash脚本来确定psql CREATE TABLE命令的数据类型然后复制数据之后,我认为最好的解决方案仍然是去大熊猫to_sql路线。

目前存在的问题here详细说明了pandas如何一次处理一行插入语句的问题。

在上面的链接中,我在导入pandas之前执行了以下简单的猴子补丁(感谢用户nhockam)。这似乎可以大大加快速度。

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print("Using monkey-patched _execute_insert")
    data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
    conn.execute(self.insert_statement().values(data))

SQLTable._execute_insert = _execute_insert

虽然我没有时间,但它看起来像其他用户在问题页面上。目前,对于通过pandas使用python批量导入csv文件,这似乎是一个相对好的解决方案。