1
votes

Erreur de migration dans django 2; AttributeError: l'objet 'str' n'a pas d'attribut 'decode'

J'exécute des migrations sur ma nouvelle application appelée «core». Lorsque j'exécute des migrations dessus, j'obtiens une erreur qui m'indique ceci;

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mymdb',
        'USER': '',
        'PASSWORD': '',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}

Je poste le Traceback ci-dessous;

    class Movie(models.Model):

    NOT_RATED = 0
    RATED_G = 1
    RATED_PG = 2
    RATED_R = 3

    RATINGS = (
        (NOT_RATED,'NR - Not Rated'),
        (RATED_G, 'G - General Audiences'),
        (RATED_PG, 'PG - Parental Guidance'),
        (RATED_R, 'R - Restricted'),
        )

    title = models.CharField(max_length=140)
    plot = models.TextField()
    year = models.PositiveIntegerField()
    rating = models.IntegerField(choices=RATINGS, default=NOT_RATED)
    runtime = models.PositiveIntegerField()
    website = models.URLField(blank=True)

    def __str__(self):
        return '{} {}'.format(self.title, self.year)

Voici le fichier Modèles;

C> python manage.py makemigrations core
Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "C:\Python37\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Python37\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Python37\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Python37\lib\site-packages\django\core\management\base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "C:\Python37\lib\site-packages\django\core\management\base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Python37\lib\site-packages\django\core\management\commands\makemigrations.py", line 101, in handle
    loader.check_consistent_history(connection)
  File "C:\Python37\lib\site-packages\django\db\migrations\loader.py", line 283, in check_consistent_history
    applied = recorder.applied_migrations()
  File "C:\Python37\lib\site-packages\django\db\migrations\recorder.py", line 73, in applied_migrations
    if self.has_table():
  File "C:\Python37\lib\site-packages\django\db\migrations\recorder.py", line 56, in has_table
    return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
  File "C:\Python37\lib\site-packages\django\db\backends\base\base.py", line 256, in cursor
    return self._cursor()
  File "C:\Python37\lib\site-packages\django\db\backends\base\base.py", line 233, in _cursor
    self.ensure_connection()
  File "C:\Python37\lib\site-packages\django\db\backends\base\base.py", line 217, in ensure_connection
    self.connect()
  File "C:\Python37\lib\site-packages\django\db\backends\base\base.py", line 197, in connect
    self.init_connection_state()
  File "C:\Python37\lib\site-packages\django\db\backends\mysql\base.py", line 233, in init_connection_state
    if self.features.is_sql_auto_is_null_enabled:
  File "C:\Python37\lib\site-packages\django\utils\functional.py", line 80, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Python37\lib\site-packages\django\db\backends\mysql\features.py", line 82, in is_sql_auto_is_null_enabled
    cursor.execute('SELECT @@SQL_AUTO_IS_NULL')
  File "C:\Python37\lib\site-packages\django\db\backends\utils.py", line 103, in execute
    sql = self.db.ops.last_executed_query(self.cursor, sql, params)
  File "C:\Python37\lib\site-packages\django\db\backends\mysql\operations.py", line 146, in last_executed_query
    query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'

Voici les paramètres de la base de données que j'utilise (MySQL):

query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'


3 commentaires

cela ressemble à du code pour Python2 qui pourrait utiliser str.decode()


mais j'utilise Python 3.7 et Django 2.2


Yup même problème avec python3.8 et django2.2


3 Réponses :


19
votes

Allez dans le dossier django, puis allez sur ce chemin:

django\db\backends\mysql

puis allez dans operations.py et trouvez query = query.decode(errors='replace') . Supprimez la ligne et mettez query = errors='replace'


1 commentaires

J'ai en fait utilisé quelque chose de similaire, j'ai dû supprimer manuellement les conditions dans le fichier Django operations.py. Je ne me souviens pas vraiment de ce que c'était, mais cela a fonctionné.



0
votes

C'est un problème qui survient dans les anciennes versions de django.

La v3.0.7 a fait l'affaire pour moi.

pip install django==3.0.7


0 commentaires

0
votes

Je viens de changer ma version de django de django == 2.2 à django == 2.1 et cela a été résolu


0 commentaires