如何将 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
我在 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