Python Sqlalchemy-关闭光标回溯时出错,内部错误:找到未读结果
我正在使用sqlalchemy将数据保存到rds(aurora serverless)中的mysql数据库中。这是通过lambda函数完成的 除了一个事实,即每当初始化一个新的lamdba容器时,我都会得到以下错误。之后,除非创建了新容器,否则一切都会再次顺利运行。据我所知,旧容器中游标的未读结果以某种方式保留了自身,当它在初始化步骤尝试创建一个新容器时,它尝试以某种方式关闭旧游标,然后抛出此异常 我在lambda的全局级别上创建引擎和sessionmaker,创建一个会话,并在每次调用处理程序时销毁一个会话Python Sqlalchemy-关闭光标回溯时出错,内部错误:找到未读结果,python,sqlalchemy,aws-lambda,amazon-aurora,Python,Sqlalchemy,Aws Lambda,Amazon Aurora,我正在使用sqlalchemy将数据保存到rds(aurora serverless)中的mysql数据库中。这是通过lambda函数完成的 除了一个事实,即每当初始化一个新的lamdba容器时,我都会得到以下错误。之后,除非创建了新容器,否则一切都会再次顺利运行。据我所知,旧容器中游标的未读结果以某种方式保留了自身,当它在初始化步骤尝试创建一个新容器时,它尝试以某种方式关闭旧游标,然后抛出此异常 我在lambda的全局级别上创建引擎和sessionmaker,创建一个会话,并在每次调用处理程序
[ERROR] 2019-08-28T13:37:22.454Z Error closing cursor
Traceback (most recent call last):
File "/var/task/sqlalchemy/engine/base.py", line 1338, in _safe_close_cursor
cursor.close()
File "/var/task/mysql/connector/cursor_cext.py", line 402, in close
self._cnx.handle_unread_result()
File "/var/task/mysql/connector/connection_cext.py", line 695, in handle_unread_result
raise errors.InternalError("Unread result found")
mysql.connector.errors.InternalError: Unread result found
这方面的任何帮助都会非常有用
下面是一段代码片段,有助于理解引发此错误的lambda
def connect_db():
def connect():
return mysql.connector.connect(host=hostname, user=username, password=password, database=database, port=port)
db = create_engine(f'mysql+mysqlconnector://', creator=connect, isolation_level='SERIALIZABLE', echo=False)
return db
# establish connection once per container
engine = connect_db()
Data.__table__.create(bind=engine, checkfirst=True)
Session = sessionmaker(bind=engine)
def save_to_database(data):
session = Session()
try:
ids = [result[0] for result in session.query(Data.id).all()]
...
#saving logic
...
session.bulk_insert_mappings(Data, insert_data)
session.flush()
session.bulk_update_mappings(Data, update_data)
session.flush()
session.commit()
except:
session.rollback()
raise
finally:
session.close()
def handler(event, context):
output = save_to_database(event)
return {'records': output}
该错误似乎与关闭光标时未用完的剩余行有关。这个问题的典型情况是,当您执行Select查询时,使用fetchone()并且不使用其余的行(请参阅),但这意味着您有另一段代码,而不是问题中显示的大容量插入。由于某些原因,驱动程序不喜欢这样,您必须使用整个游标(在关闭游标或使用缓冲游标之前调用fetchall())此错误似乎与游标在关闭时未用完的剩余行有关。这个问题的典型情况是,当您执行Select查询时,使用fetchone()并且不使用其余的行(请参阅),但这意味着您有另一段代码,而不是问题中显示的大容量插入。由于某些原因,驱动程序不喜欢这样,您必须使用整个游标(在关闭游标或使用缓冲游标之前调用fetchall())My bad,忘记在表中包含所有ID的select查询,但似乎我正在执行fetchall和not FETCHANE,更新了我的问题My bad,忘了在表中包含所有ID的select查询,但似乎我正在执行fetchall和not fetchone,相应地更新了我的问题