Mysql
 sql >> Base de données >  >> RDS >> Mysql

erreur d'importation avec python-mysql-connector 1.16, django 1.6 et python 3.2.3

Après avoir étudié le code, il semble qu'il y ait une sorte d'erreur lors de la référence à cette importation. J'ai regardé dans le fichier /lib/python3.2/site-packages/django/utils/six.py et j'ai trouvé où se trouvait la référence au module move.zip_longest.

La première était cette référence :

moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves")

Ce qui signifie qu'il appelait la classe _MovedItems, et ici c'est avec la référence à mon module qui cassait.

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

Qui hérite alors de la classe _LazyDescr, mais c'est un petit objet court. Je ne sais pas où les choses se sont mal passées, si vous mappez le tuple passé dans le constructeur MovedAttribute, il mappe correctement l'ancienne version à la nouvelle. Je ne sais pas pourquoi cela échoue, mais si vous supprimez l'instruction d'importation dans le fichier compiler.py et appelez simplement itertools zip_longest directement, tout fonctionne.

Voici à quoi cela ressemble. Si vous utilisez Python 3, modifiez le fichier /lib/python3.2/site-packages/mysql/connector/django/compiler.py et modifiez la ligne 6 à partir de ceci :

from django.utils.six.moves import zip_longest as six_zip_longest

à ceci :

from itertools import zip_longest