间歇“ORA-01458:变量字符串内长度无效”的错误插入使用的SQLAlchemy

问题描述:

我工作的一个Python 3.5服务器项目,并使用SQLAlchemy的1.0.12与cx_Oracle 5.2.1将数据插入到Oracle数据到Oracle数据库时11克。我注意到,我的多行表插入的许多内存因“ORA-01458:变量字符串内的无效长度”错误而间歇性失败。间歇“ORA-01458:变量字符串内长度无效”的错误插入使用的SQLAlchemy

我一般插几千到几万行的时间,并且数据主要由弦,熊猫时间戳和浮点数。我曾提出以下意见:

  1. 对Python的服务器Windows和Linux主机操作系统上发生的错误
  2. 错误总是发生间歇性,即使数据不改变
  3. 如果我不“T插入浮点数,或者如果我圆他们的错误经常发生较少,但仍然发生
  4. 如果我插入的行一次一个我没有遇到错误(但这个是不能接受的我的性能代价)

此外,如果遇到错误,我尝试再次插入。我想的第一件事是到了把try-except块左右,我调用execute在sqlalchemy.engine.base.Connection像下面对象:

try: 
    connection.execute(my_table.insert(), records) 
except DatabaseError as e: 
    connection.execute(my_table.insert(), records) 

我注意到,使用此方法的第二插入仍然经常失败。我试过的第二件事是尝试做同样的do_executemany的实施OracleDialect_cx_oracle在SQLAlchemy的包(SQLAlchemy的\方言\ ORACLE \ cx_oracle.py):

def do_executemany(self, cursor, statement, parameters, context=None): 
    if isinstance(parameters, tuple): 
     parameters = list(parameters) 

    # original code 
    # cursor.executemany(statement, parameters) 

    # new code 
    try: 
     cursor.executemany(statement, parameters) 
    except Exception as e: 
     print('trying again') 
     cursor.executemany(statement, parameters) 

奇怪的是,当我这样做这样第二个executemany调用将始终工作,如果第一个失败。我不确定这意味着什么,但我认为这指向的是cx_Oracle驱动程序,而不是sqlalchemy而不是sqlalchemy。

我在网上到处搜索过,还没有看到任何相同问题的报告。任何帮助将不胜感激!

我们发现,如果我们全部更换与无的的Float.NaN对象,我们做插入错误之前完全消失。真的很奇怪!

我有同样的问题,代码有时失败,有时经过,没有错误。显然我的块大小对于缓冲区来说很大,一旦我将块大小从10K减少到500行,错误就不会再发生了。