我将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)
Run Code Online (Sandbox Code Playgroud)
我已插入更高级别的详细信息,现在正在搜索数据库以将此较低级别信息与其父级相关联.找到此唯一值的唯一方法是使用time_stamp搜索原点和目标坐标.我相信逻辑是合理的,并且在本节之后立即打印leg_no,我可以看到在第一次检查时出现的值是正确的
但是,当添加到代码的其余部分时,它会导致后续部分使用游标插入更多数据以使此错误失败 -
raise errors.InternalError("Unread result found.")
mysql.connector.errors.InternalError: Unread result found.
Run Code Online (Sandbox Code Playgroud)
这个问题与使用Python的MySQL未读结果类似
查询是否过于复杂且需要拆分还是存在其他问题?
如果查询确实太复杂,任何人都可以建议如何最好地拆分它?
编辑根据@ Gord的帮助,我试图抛弃任何未读的结果
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))
Run Code Online (Sandbox Code Playgroud)
但是,我仍然得到
raise errors.InternalError("Unread result found.")
mysql.connector.errors.InternalError: Unread result found.
[Finished in 3.3s with exit code 1]
Run Code Online (Sandbox Code Playgroud)
划痕头
编辑2 - 当我打印ie.msg时,我得到 -
No result set to fetch from
Run Code Online (Sandbox Code Playgroud)
Lea*_*wly 122
所需要的只是将缓冲设置为true!
cursor = cnx.cursor(buffered=True)
Run Code Online (Sandbox Code Playgroud)
Gor*_*son 19
我能够重新创建你的问题.MySQL Connector/Python显然不喜欢它,如果您检索多行并且在关闭游标或使用它来检索其他内容之前不会全部获取它们.例如
import mysql.connector
cnxn = mysql.connector.connect(
host='127.0.0.1',
user='root',
password='whatever',
database='mydb')
crsr = cnxn.cursor()
crsr.execute("DROP TABLE IF EXISTS pytest")
crsr.execute("""
CREATE TABLE pytest (
id INT(11) NOT NULL AUTO_INCREMENT,
firstname VARCHAR(20),
PRIMARY KEY (id)
)
""")
crsr.execute("INSERT INTO pytest (firstname) VALUES ('Gord')")
crsr.execute("INSERT INTO pytest (firstname) VALUES ('Anne')")
cnxn.commit()
crsr.execute("SELECT firstname FROM pytest")
fname = crsr.fetchone()[0]
print(fname)
crsr.execute("SELECT firstname FROM pytest") # InternalError: Unread result found.
Run Code Online (Sandbox Code Playgroud)
如果您只期望(或关心)一行,那么您可以LIMIT在查询上添加一个
crsr.execute("SELECT firstname FROM pytest LIMIT 0, 1")
fname = crsr.fetchone()[0]
print(fname)
crsr.execute("SELECT firstname FROM pytest") # OK now
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用fetchall()在完成处理所检索的行后删除任何未读结果.
crsr.execute("SELECT firstname FROM pytest")
fname = crsr.fetchone()[0]
print(fname)
try:
crsr.fetchall() # fetch (and discard) remaining rows
except mysql.connector.errors.InterfaceError as ie:
if ie.msg == 'No result set to fetch from.':
# no problem, we were just at the end of the result set
pass
else:
raise
crsr.execute("SELECT firstname FROM pytest") # OK now
Run Code Online (Sandbox Code Playgroud)