如何将 pandas DataFrame 直接写入 Netezza 数据库?

How to write a pandas DataFrame directly into a Netezza Database?

我在 python 中有一个 pandas DataFrame,并希望将此 DataFrame 直接写入 Netezza 数据库。

我想使用 here 中描述的 pandas.to_sql() 方法,但似乎此方法需要使用 SQLAlchemy 连接到数据库。 问题:SQLAlchemy 不支持 Netezza。 我现在用来连接数据库的是pyodbc。但另一方面,pandas.to_sql() 不理解这一点,或者我对此有误吗?

我的解决方法是通过 pandas.to_csv() 将 DataFrame 写入 csv 文件,然后通过 pyodbc 将其发送到 Netezza 数据库。

因为我有大数据,所以先写csv是一个性能问题。实际上,我不在乎是否必须使用 SQLAlchemy 或 pyodbc 或其他不同的东西,但我无法改变我拥有 Netezza 数据库的事实。

我知道道义学家项目,但正如作者所说 "is far from complete, has a lot of bugs"。 我得到了工作包(见下面我的解决方案)。但如果有人现在有更好的解决方案,请告诉我!

我明白了。对于我的解决方案,请参阅已接受的答案。

解决方案

我找到了一个解决方案,我想分享给所有有同样问题的人。 我尝试了 deontologician but it does not work with python3 so I made a fork and corrected some encoding issues. I uploaded to github and it is available here 中的 netezza 方言。请注意,我只是做了一些小改动,这主要是道义学家的工作,没有人维护它。

有了 netezza 方言,我 pandas.to_sql() 可以直接使用 Netezza 数据库:

import netezza_dialect
from sqlalchemy import create_engine

engine = create_engine("netezza://ODBCDataSourceName")

df.to_sql("YourDatabase", 
          engine,  
          if_exists='append',
          index=False,
          dtype=your_dtypes,
          chunksize=1600,
          method='multi')

to_sql()参数的一点解释:

如果不想让pandas永远写入数据库,必须使用method='multi'参数。因为没有它,它会每行发送一个 INSERT 查询。您可以使用 'multi' 或者您可以定义自己的插入方法。请注意,您必须至少 pandas v0.24.0 才能使用它。 See the docs 获取更多信息。

使用 method='multi' 时,您可能会超出参数限制(至少对我而言是这样)。在我的例子中它是 1600 所以我必须添加 chunksize=1600 来避免这种情况。

备注

如果您收到如下警告或错误:

C:\Users\USER\anaconda3\envs\myenv\lib\site-packages\sqlalchemy\connectors\pyodbc.py:79: SAWarning: No driver name specified; this is expected by PyODBC when using DSN-less connections
  "No driver name specified; "
pyodbc.InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')

然后你可能会尝试通过

连接到数据库
engine = create_engine(netezza://usr:pass@address:port/database_name)

您必须在 Windows 的 ODBC 数据源管理器工具中设置数据库,然后使用您在此处定义的名称。

engine = create_engine(netezza://ODBCDataSourceName)

那么找驱动应该没有问题

我知道你已经自己回答了这个问题(感谢分享解决方案)

一条关于大数据写入 Netezza 的一般评论: 我总是选择将数据写入文件,然后使用外部 table/ODBC 接口插入数据。您可以在同一时间范围内插入数百万行,而不是一次插入 1600 行。

除非您想加载可能需要固定宽度文件的二进制数据,否则我们在平面文件和 CSV 中使用 UTF8 数据。

我不是python精明的人,但我希望你能关注我...

如果您需要文档 link,可以从这里开始:https://www.ibm.com/support/knowledgecenter/en/SSULQD_7.2.1/com.ibm.nz.load.doc/c_load_create_external_tbl_syntax.html