Tudo o que era necessário era para
buffered
para ser definido como verdadeiro!
cursor = cnx.cursor(buffered=True)
A razão é que, sem um cursor em buffer, os resultados são carregados "preguiçosamente", o que significa que "fetchone" na verdade busca apenas uma linha do conjunto de resultados completo da consulta. Quando você usar o mesmo cursor novamente, ele reclamará que você ainda tem n-1 resultados (onde n é o valor do conjunto de resultados) esperando para serem buscados. No entanto, quando você usa um cursor em buffer, o conector busca TODAS as linhas nos bastidores e você apenas pega uma do conector para que o banco de dados mysql não reclame.