【问题标题】:Pyodbc insert of large number fails int to big to convert when inserting into Sql Server using Oracle cursor使用 Oracle 游标插入 Sql Server 时,大量 Pyodbc 插入无法将 int 转换为 big
【发布时间】:2021-03-11 13:47:44
【问题描述】:

我正在尝试使用这样的 Oracle 游标插入 SQL Server 来执行 executemany:

sqlservercursor.executemany("INSERT INTO tablename (col1,col2...) VALUES (?,?…)",oraclecursor)

这失败并出现错误:OverflowError: int too big to convert

我已将其诊断为大数字 (NUMBER(25)) 的 id 列。

我可以使用:

sqlservercursor.execute('INSERT INTO tablename (Id) VALUES (?)',(90100111000002885322904,))
                

然而这是可行的:

sqlservercursor.execute('INSERT INTO tablename (Id) VALUES (90100111000002885322904)')

有没有办法解决这个问题,或者我必须遍历光标并手动插入?与 pyodbc 的快速执行以及必须处理字符相比,这会很慢......

【问题讨论】:

  • 为什么要为 SQL Server 实例使用 oracle 游标?
  • 我必须将 Oracle DB 传输到 SQL Server。话虽如此,如果我相信您有一个 Decimal(38) 数字,或者我只是想使用参数添加大数字,这个问题将持续存在 SQL Server 到 SQL Server

标签: python sql-server oracle pyodbc


【解决方案1】:

我能够重现您的问题并使用 fast_executemany 解决它:

cnxn = pyodbc.connect("DSN=mssqlLocal64")
crsr = cnxn.cursor()
crsr.execute("CREATE TABLE ##tablename (Id decimal(25,0))")
data = [(90100111000002885322904,)]  # list of tuple(s)
sql = "INSERT INTO ##tablename (Id) VALUES (?)"
crsr.fast_executemany = True
crsr.executemany(sql, data)

【讨论】:

  • 这适用于编码版本,但是当我向 executemany 提供 Oracle 光标时,我仍然收到错误。我拉了 1 行,给出了一个错误,然后将该行转换为一个元组列表并以这种方式插入它并且它工作,所以它与光标有关。知道如何解决吗?如果不是,我将不得不将光标逐行转换为元组?谢谢
  • 小心术语。 “光标”在 DBAPI 应用程序的上下文中具有特定的含义。我怀疑你拥有的是一个“结果集”,它通常是一个元组列表,但也可以是一个类似元组的对象的列表。在任何情况下,您都可以尝试将单行 oraclecursor 对象(导致错误的对象)腌制到一个文件中,然后发布一个下载链接,以便其他人可以尝试重现该问题。
  • 我现在可以使用它了。我在参数中使用了 oraclecursor.fetchall()(创建一个元组列表)。有几个表会引发内存错误,我怀疑我需要使用块而不是全部。再次感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 2014-08-17
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 2015-06-20
相关资源
最近更新 更多