间歇“ORA-01458:变量字符串内长度无效”的错误插入使用的SQLAlchemy
问题描述:
我工作的一个Python 3.5服务器项目,并使用SQLAlchemy的1.0.12与cx_Oracle 5.2.1将数据插入到Oracle数据到Oracle数据库时11克。我注意到,我的多行表插入的许多内存因“ORA-01458:变量字符串内的无效长度”错误而间歇性失败。间歇“ORA-01458:变量字符串内长度无效”的错误插入使用的SQLAlchemy
我一般插几千到几万行的时间,并且数据主要由弦,熊猫时间戳和浮点数。我曾提出以下意见:
- 对Python的服务器Windows和Linux主机操作系统上发生的错误
- 错误总是发生间歇性,即使数据不改变
- 如果我不“T插入浮点数,或者如果我圆他们的错误经常发生较少,但仍然发生
- 如果我插入的行一次一个我没有遇到错误(但这个是不能接受的我的性能代价)
此外,如果遇到错误,我尝试再次插入。我想的第一件事是到了把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行,错误就不会再发生了。