Sqlalchemy - 关闭游标时出错 回溯与内部错误:找到未读结果



我正在使用sqlalchemy将数据保存到rds(aurora-serverless(中的mysql数据库中。这是通过 lambda 函数完成的。

一切正常,除了每当初始化新的lamdba容器时,我都会收到以下错误。之后,除非创建新容器,否则一切将再次顺利运行。据我所知,旧容器中游标的未读结果以某种方式保留自身,当它尝试在初始化步骤中创建一个新容器时,它会尝试以某种方式关闭旧游标,然后抛出此异常。

我正在 lambda 的全局级别创建引擎和会话生成器,并创建一个会话并在每次调用我的处理程序时销毁它。

[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}

该错误似乎与 Cursor 具有在关闭时未耗尽的剩余行有关。此问题的典型情况是,当您执行 Select 查询、使用 fetchone(( 并且不消耗其余行(请参阅 https://stackoverflow.com/a/29774476/6203472(时,但这意味着您有另一段代码,而不是问题中显示的批量插入。由于某种原因,驱动程序不喜欢这样,您必须使用整个游标(在关闭游标或使用缓冲游标之前调用 fetchall(( (

最新更新