当前位置: 首页 > 面试题库 >

Python MySQL连接器-使用fetchone时发现未读结果

尹小云
2023-03-14
问题内容

我正在将JSON数据插入MySQL数据库

我正在解析JSON,然后使用python连接器将其插入到MySQL数据库中

通过试用,我可以看到错误与这段代码有关

for steps in result['routes'][0]['legs'][0]['steps']:
    query = ('SELECT leg_no FROM leg_data WHERE travel_mode = %s AND Orig_lat = %s AND Orig_lng = %s AND Dest_lat = %s AND Dest_lng = %s AND time_stamp = %s')
    if steps['travel_mode'] == "pub_tran":
        travel_mode = steps['travel_mode']
        Orig_lat = steps['var_1']['dep']['lat']
        Orig_lng = steps['var_1']['dep']['lng']
        Dest_lat = steps['var_1']['arr']['lat']
        Dest_lng = steps['var_1']['arr']['lng']
        time_stamp = leg['_sent_time_stamp'] 
    if steps['travel_mode'] =="a_pied":
        query = ('SELECT leg_no FROM leg_data WHERE travel_mode = %s AND Orig_lat = %s AND Orig_lng = %s AND Dest_lat = %s AND Dest_lng = %s AND time_stamp = %s')
        travel_mode = steps['travel_mode']
        Orig_lat = steps['var_2']['lat']
        Orig_lng = steps['var_2']['lng']
        Dest_lat = steps['var_2']['lat']
        Dest_lng = steps['var_2']['lng']
        time_stamp = leg['_sent_time_stamp']
    cursor.execute(query,(travel_mode, Orig_lat, Orig_lng, Dest_lat, Dest_lng, time_stamp))
    leg_no = cursor.fetchone()[0]
    print(leg_no)

我已经插入了较高级别的详细信息,现在正在搜索数据库以将此较低级别的信息与其父级关联。找到此唯一值的唯一方法是通过带有time_stamp的起点和终点坐标进行搜索。我相信逻辑是合理的,并且通过在此部分之后立即打印leg_no,我可以看到第一次检查时出现的值是正确的

但是,当添加到其余代码中时,它将导致随后的部分(使用光标插入更多数据)失败,并出现此错误-

    raise errors.InternalError("Unread result found.")
mysql.connector.errors.InternalError: Unread result found.

该问题似乎类似于Python的MySQL未读结果

查询是否太复杂并且需要拆分?还是还有其他问题?

如果查询确实太复杂了,谁能建议如何最好地将其分开?

编辑根据@Gord的帮助,Ive尝试转储所有未读的结果

cursor.execute(query,(leg_travel_mode, leg_Orig_lat, leg_Orig_lng, leg_Dest_lat, leg_Dest_lng))
            leg_no = cursor.fetchone()[0]
            try:
                cursor.fetchall()
            except mysql.connector.errors.InterfaceError as ie:
                if ie.msg == 'No result set to fetch from.':
                    pass
                else:
                    raise
            cursor.execute(query,(leg_travel_mode, leg_Orig_lat, leg_Orig_lng, leg_Dest_lat, leg_Dest_lng, time_stamp))

但是,我仍然得到

raise errors.InternalError("Unread result found.")
mysql.connector.errors.InternalError: Unread result found.
[Finished in 3.3s with exit code 1]

抓头

编辑2-当我打印ie.msg时,我得到-

No result set to fetch from

问题答案:

所需要做的只是buffered将其设置为true!

cursor = cnx.cursor(buffered=True)

原因是没有缓冲的游标,结果将“延迟”加载,这意味着“
fetchone”实际上仅从查询的整个结果集中获取一行。当您再次使用同一光标时,它会抱怨您仍有n-1个结果(其中n是结果集数量)正在等待获取。但是,当您使用带缓冲的游标时,连接器会在后台获取所有行,而您只需从连接器中获取一行,这样mysql
db就不会抱怨。



 类似资料:
  • 我得到一个连接不打开发送()错误后立即连接到一个万花筒节点的网络套接字。我试图从web3js版本1.0.0-beta.34使用WebSocketProvider。 我的连接代码看起来像这样,其中,和是带有Kaleido节点信息的局部变量。 我已经尝试了Github问题中列出的建议步骤——在连接丢失时尝试重新连接,但错误仍然存在。我认为这可能是一个Kaleido问题,因为我可以使用Websocket

  • 问题内容: 在Eclipse中安装SVN插件并重新启动后,出现一条消息,要求安装连接器。有SVN套件和本机JavaHL连接器。我很困惑要安装哪一个,为什么,请指导我。 问题答案: 这两个连接器都应该工作,这是区别(使用它们的经验更多,而不是阅读其源代码): SVN套件: 适用于所有平台,是仅Java的实现(无需DLL或共享库)。 比JavaHL Native慢一点。 将其配置保留在实际的Subve

  • 请有人能帮我摆脱这个问题。 以下错误:java.lang.IllegalArgumentException:''在“schema_name”.“table_name”表中不存在。“table_name”表在io.pivotal.greenplum.spark.greenplumRelationProvider.createrelation(GreenplumRelationProvider.sca

  • 我已经部署了一个nginx容器,并且公开了端口8080:80,但是当我执行curl localhost:8080时,我会得到“recv failure:连接由peer重置”。我已经允许端口8080的入站规则允许入站流量通过容器。

  • 我正在使用asmack-android-16为我的聊天应用程序。有时,在创建连接,我得到SSL异常,然后我无法登录服务器。我的服务器正在对连接使用SSL身份验证。有人能帮帮我吗?我已经挣扎了好几周了 以下是我的连接配置: XMPPConnection连接=new XMPPConnection(连接配置);connection.connect (); // 调用此行会给我异常,尽管已创建连接。 以下

  • 我正在尝试使用mySQL c连接器。我已经按照mysql指南https://dev . MySQL . com/doc/connector-CPP/8.0/en/connector-CPP-installation-binary . html下载并解压了二进制文件 当我包括 xdevapi 像这样 我得到以下错误 /tmp/cc6dzD4k.o:在函数` mysqlx::string::opera