【问题标题】:Need to insert with smaller batches to Teradata table with pyodbc需要使用 pyodbc 将小批量插入 Teradata 表
【发布时间】:2019-11-27 18:15:54
【问题描述】:

我正在尝试通过 pyodbc 小批量将 pandas 数据帧中的数据插入 Teradata 表中。

我能够成功插入一小部分数据样本集,但是当我尝试插入整个数据帧(大约 125k 行)时,我收到了以下错误消息:[Teradata][ODBC Teradata Driver] SQL 请求超出了允许的最大值长度为 1 MB。

在做了一些研究之后,我的插入语句似乎太大了,所以我想把它分解成更小的批量大小。我研究了 cursor.executemany 和它的必要参数,但我能够找到任何地方来定义批量大小。

import pyodbc
import pandas as pd

# Delete All Records pertaining to Max Report Month
cursor = connection.cursor()
sql_del = "DELETE FROM database.table WHERE RPT_MTH = '" + max_mth + "';"
cursor.execute(sql_del)
connection.commit()

# Insert All Predictions
data = df_prod.values.tolist()
cursor.fast_executemany = True
cursor.executemany('INSERT INTO database.table VALUES (?,?,?,?)', data)
connection.commit()

# Close Connections
cursor.close()
connection.close()

【问题讨论】:

  • 你试过df_prod.to_sql('table', engine, schema='database', if_exists='append', index=False, chunksize=1000) ...吗?
  • @GordThompson 我明白了,我还没有尝试过这个。我将如何导出引擎?我的连接是这样派生的:user = 'user' pasw = 'pasw' host = 'host' connection = pyodbc.connect('DRIVER=Teradata;DBCNAME=' + host + ';UID=' + user + ';PWD=' + pasw + ';QUIETMODE=YES' ,autocommit = True ,unicode_results = True)
  • Teradata 建议使用他们自己的 SQLAlchemy 方言。详情here.
  • @GordThompson,感谢您提供的信息。我按照说明安装了必要的库。但是,我不断收到错误消息:NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:teradata 你以前遇到过这种情况吗?
  • 我自己不使用 Teradata,但this issue 看起来很相似。

标签: python pyodbc


【解决方案1】:

@贾斯汀 如果您有每天插入次数的限制,您可以尝试直接从文件中使用 teradata 推荐的实用程序,例如 TPT、MLOAD,而不是使用 Py。

【讨论】:

  • 是的,这始终是一个选项,我只是试图将它们全部保存在同一个系统中,而不是在 python 之外调用自动化过程。
猜你喜欢
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
相关资源
最近更新 更多