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

Python Sqlalchemy-关闭光标回溯时出错,内部错误:找到未读结果,python,sqlalchemy,aws-lambda,amazon-aurora,Python,Sqlalchemy,Aws Lambda,Amazon Aurora,我正在使用sqlalchemy将数据保存到rds(aurora serverless)中的mysql数据库中。这是通过lambda函数完成的 除了一个事实,即每当初始化一个新的lamdba容器时,我都会得到以下错误。之后,除非创建了新容器,否则一切都会再次顺利运行。据我所知,旧容器中游标的未读结果以某种方式保留了自身,当它在初始化步骤尝试创建一个新容器时,它尝试以某种方式关闭旧游标,然后抛出此异常 我在lambda的全局级别上创建引擎和sessionmaker,创建一个会话,并在每次调用处理程序

我正在使用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,相应地更新了我的问题