MySQL从第二个查询开始不返回任何行

时间:2019-03-20 22:07:57

标签: python mysql python-3.x pymysql

我有一个与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中此查询的返回值:

enter image description here

但是我代码中的此查询不返回任何内容,并且在for循环结束时,在返回之前,它被称为析构函数并关闭了我的连接:

enter image description here

然后,我再次从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))

这段代码,第一次返回我:

enter image description here

查询返回我数据。您可以检查它,因为“总行数”返回的数字> 0。

第二次执行for循环。值是:

enter image description here

您怎么看,代码返回0行,但是如果我在mysql中执行查询,我就会得到数据:

enter image description here

因此,第二次查询时无法获取数据的情况发生了。为什么我没有从查询中获取行?为什么cursor.fetchall()返回空数据?

在这里您可以看到如何返回空数据以及正确定义了查询。

enter image description here

我什么都不懂:(

0 个答案:

没有答案