文章内容

2020/9/10 15:51:03,作 者: 黄兵

MySQLdb cursor closed

在执行MySQL事务查询的时候,出现了如下错误:

cursor closed

具体错误代码如下:

for item in get_all:
    sms_receive_id = item[0]
    phone_number = item[1]
    content = item[2]
    receive_time = item[3]
    is_type = item[4]
    show = item[5]
    phone_number_id = item[6]
    insert_sql = "INSERT INTO history_2019 (PhoneNumber, Content, SMS_ReceiveTime, Type, IsShow, PhoneNumber_id) values (%s,%s,%s,%s,%s,%s)"
    delete_sql = "DELETE FROM table_name WHERE id='{id}';".format(id=sms_receive_id)
    try:
        # 开始执行事务
        # 插入数据
        cur.execute(insert_sql,
                    (phone_number, content, receive_time, is_type, show, phone_number_id))
        # 删除数据
        cur.execute(delete_sql)
        # 游标关闭
        cur.close()
        # 提交数据
        mysql_conn.commit()
    except (MySQLdb.Error, MySQLdb.Warning) as e:
        self._logger_write_file.error(
            ' 执行插入和删除SQL命令的时候出现错误,具体错误内容: {error_message}'.format(error_message=e))
        # 发生错误时回滚
        cur.close()
        mysql_conn.rollback()

出现错误的原因:

第一个循环是将查询出来的数据插入到另外一张表,同时删除原来表中的数据,但是在遍历完成之后已经将游标关闭,也就是:

# 游标关闭
cur.close()

下次查询再次遍历的时候,游标已经关闭,所以才出现如上提示。

解决方案:

删除cur.close(),在except里面关闭游标,具体代码如下:

try:
    # 开始执行事务
    # 插入数据
    cur.execute(insert_sql,
                (phone_number, content, receive_time, is_type, show, phone_number_id))
    # 删除数据
    cur.execute(delete_sql)
    # 提交数据
    mysql_conn.commit()
except (MySQLdb.Error, MySQLdb.Warning) as e:
    self._logger_write_file.error(
        ' 执行插入和删除SQL命令的时候出现错误,具体错误内容: {error_message}'.format(error_message=e))
    # 发生错误时回滚
    cur.close()
    mysql_conn.rollback()


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - MySQLdb cursor closed

分享到:

发表评论

评论列表