Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

erro de importação com python-mysql-connector 1.16, django 1.6 e python 3.2.3


Depois de estudar o código parece que há algum tipo de erro ao referenciar essa importação. Eu olhei para o arquivo /lib/python3.2/site-packages/django/utils/six.py e encontrei onde estava a referência ao módulo moves.zip_longest.

Primeiro foi esta referência:
moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves")

O que significa que estava chamando a classe _MovedItems, e aqui está com a referência ao meu módulo que estava quebrando.
class _MovedItems(_LazyModule):
    """Lazy loading of moved objects"""

    _moved_attributes = [
        MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest")

class MovedAttribute(_LazyDescr):

    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
        super(MovedAttribute, self).__init__(name)
        if PY3:
            if new_mod is None:
            new_mod = name
            self.mod = new_mod
            if new_attr is None:
                if old_attr is None:
                    new_attr = name
                else:
                    new_attr = old_attr
            self.attr = new_attr

Que então herda da classe _LazyDescr, mas esse é um pequeno objeto pequeno. Não sei onde as coisas deram errado, se você mapear a tupla que está sendo passada para o construtor MovedAttribute, ela mapeia corretamente a versão antiga para a nova. Não sei por que está falhando, mas se você remover a instrução de importação no arquivo compiler.py e simplesmente chamar itertools zip_longest diretamente, tudo funcionará.

Aqui está o que parece. Se você estiver usando o Python 3, edite o arquivo /lib/python3.2/site-packages/mysql/connector/django/compiler.py e altere a linha 6 desta:
from django.utils.six.moves import zip_longest as six_zip_longest

para isso:
from itertools import zip_longest