我有一个与MySQL进行交互的对象,我第一次使用该对象就可以正常工作,并向我提供查询中的所有数据,但是当我尝试重用时,查询时的行数为零做得很好,并在mysql中返回数据。我正在使用MySQL 8.0
这是代码:
tcm = FIBAColourMap()
for p in players:
args = [p["id"], id_competition]
print("id player: {}".format(p["id"]))
search = SearchDataFIBA(args, "player.shots.by.competition=")
if search.get_result().getTotalRows() > 0:
shots = search.get_result().getData()
for s in shots:
x = float(FIBASCReport.adjust_x(s["x"]))
y = float(FIBASCReport.adjust_y(s["y"]))
print("x: {} - y: {}".format(x, y))
color = tcm.image.getpixel((x,y))
color = ("#%02x%02x%02x" % color).upper()
if tcm.exists_color(color):
if int(s["m"]) == 0:
tcm.set_scored_shots(color, 1)
else:
tcm.set_failed_shots(color, 1)
else:
if int(s["m"]) == 0:
tcm.set_scored_shots("OTROS", 1)
else:
tcm.set_failed_shots("OTROS", 1)
else:
print("Jugadora con id: {} NO ha realizado ningún tiro en competicion: {}".format(p["id"], id_competition))
return tcm
在这里,我有一个名为SearchDataFIBA的搜索对象,该对象第一次运行良好。但是当它第二次执行时,因为在for循环中,所以该对象不返回任何内容,我也不知道为什么:(
此对象在内部调用此方法以执行查询:
def query(self, sql, data):
"""Returns a ResultData object"""
# try:
with self.connection.cursor() as cursor:
totalRows = cursor.execute(sql, data)
print("Total Rows: " + str(totalRows))
print("Ultima query: " + cursor.mogrify(sql, data))
data = cursor.fetchall()
if totalRows > 0:
result = ResultData(RESULT.RESULT_OK, data, totalRows)
else:
result = ResultData(RESULT.RESULT_OK, None, totalRows)
return result
此代码的第一次执行将打印执行的查询并返回总行数。总是返回定义良好的查询,该查询在mysql中有效,但是从第二次执行起,该查询在必须返回行时不会返回任何行。
我在做什么错了?
编辑我:
ResultData对象
class ResultData(object):
"""Objeto que contendrá el resultado de una consulta"""
def __init__(self, result, data, totalRows):
self.setResult(result)
self.setTotalRows(totalRows)
self.setData(data)
"""Setters & Getters"""
def setResult(self, result):
self.result = result
def getResult(self):
return self.result
def setTotalRows(self, tr):
if tr != None:
self.totalRows = int(tr)
else:
self.totalRows = None
def getTotalRows(self):
return self.totalRows
def setData(self, data):
"""Diccionario que contiene los datos devueltos desde la BBDD"""
if self.getTotalRows() != None and data != None:
self.data = data.copy()
else:
self.data = None
def getData(self):
return self.data
编辑II:
我发现了一些奇怪的东西。第一次进入for循环时,我调用SearchDataFIBA对象,然后打开连接并进行查询。该查询正确返回了数据,因此返回到for循环的beginnig,但我没有关闭连接(不要编写为析构函数编写的消息)。我用正确的值来定义另一个查询,例如:
从tbl030_shots_chart sc,tbl006_player_team pt,tbl007_game g,tbl004_jornada j,tbl012_competition c中选择sc。*,其中pt.id = 67和pt.id_player_feb = sc.id_fiba和sc.id_game = g.id和g.id_jornada = j .id和j.id_competition = c.id和c.id = 3
这是mysql中此查询的返回值:
但是我代码中的此查询不返回任何内容,并且在for循环结束时,在返回之前,它被称为析构函数并关闭了我的连接:
然后,我再次从for循环的开头开始并继续。
编辑III:
我使用以下代码创建连接:
self.connection = pymysql.connect(host = DDBB.DDBB_FIBA_HOST,
user = DDBB.DDBB_FIBA_USER,
password = DDBB.DDBB_FIBA_PSWD,
db = DDBB.DDBB_FIBA_NAME,
charset = DDBB.DDBB_FIBA_CHARSET,
cursorclass=pymysql.cursors.DictCursor)
问题是在此代码的 totalRows = cursor.execute(sql,data)行中产生的。
def query(self, sql, data):
"""Método que devuelve un objeto ResultData con el resultado de la consulta"""
# try:
with self.connection.cursor() as cursor:
print("sql: {} - data: {}".format(sql, data))
totalRows = cursor.execute(sql, data)
print("Total Rows: " + str(totalRows))
print("Ultima query: " + cursor.mogrify(sql, data))
data = cursor.fetchall()
if totalRows > 0:
result = ResultData(RESULT.RESULT_OK, data, totalRows)
else:
result = ResultData(RESULT.RESULT_OK, None, totalRows)
return result
当我调用此函数时,变量sql和data的值始终正确。但是,当执行 totalRows = cursor.execute(sql,data)时,第一次执行时返回数据,但是第二次执行,而当sql和data变量正确时,第二次则不返回任何内容。该连接在for循环结束时关闭。
编辑IV:
我已经更新了代码,简化并进行了测试。此代码执行相同的查询,但是n次使用不同的参数。第一次,查询的执行返回数据,第二次,如果在mysql中执行查询返回数据,则下次不返回任何数据。
这是代码:
def get_team_colour_map(self, players, id_competition):
tcm = FIBAColourMap()
for p in players:
args = [p["id"], id_competition]
print("id player: {}".format(p["id"]))
conn = pymysql.Connect(host = DDBB.DDBB_FIBA_HOST,
user = DDBB.DDBB_FIBA_USER,
password = DDBB.DDBB_FIBA_PSWD,
db = DDBB.DDBB_FIBA_NAME,
charset = DDBB.DDBB_FIBA_CHARSET,
cursorclass=pymysql.cursors.DictCursor)
with conn.cursor() as cursor:
print("args: {}".format(args))
cursor.execute("select sc.* from tbl030_shots_chart sc, tbl006_player_team pt, tbl007_game g, tbl004_jornada j, tbl012_competition c where pt.id = %s and pt.id_player_feb = sc.id_fiba and sc.id_game = g.id and g.id_jornada = j.id and j.id_competition = c.id and c.id = %s", args)
data = cursor.fetchall()
print("Total rows: {}".format(cursor.rowcount))
if cursor.rowcount > 0:
for s in data:
x = float(FIBASCReport.adjust_x(s["x"]))
y = float(FIBASCReport.adjust_y(s["y"]))
color = tcm.image.getpixel((x,y))
color = ("#%02x%02x%02x" % color).upper()
if tcm.exists_color(color):
if int(s["m"]) == 0:
tcm.set_scored_shots(color, 1)
else:
tcm.set_failed_shots(color, 1)
else:
if int(s["m"]) == 0:
tcm.set_scored_shots("OTROS", 1)
else:
tcm.set_failed_shots("OTROS", 1)
else:
#tcm = None
print("Jugadora con id: {} NO ha realizado ningún tiro en competición: {}".format(p["id"], id_competition))
return tcm
在for循环中,我们输出id播放器和使用说明传递给查询的参数
print("id player: {}".format(p["id"]))
print("args: {}".format(args))
这段代码,第一次返回我:
查询返回我数据。您可以检查它,因为“总行数”返回的数字> 0。
第二次执行for循环。值是:
您怎么看,代码返回0行,但是如果我在mysql中执行查询,我就会得到数据:
因此,第二次查询时无法获取数据的情况发生了。为什么我没有从查询中获取行?为什么cursor.fetchall()返回空数据?
在这里您可以看到如何返回空数据以及正确定义了查询。
我什么都不懂:(