【问题标题】:How to fix AttributeError: 'bytes' object has no attribute 'encode' if using mysql?如何修复 AttributeError:如果使用 mysql,'bytes' 对象没有属性 'encode'?
【发布时间】:2019-06-23 13:00:54
【问题描述】:

截至昨天,Django 开发服务器使用 mysql 运行良好。但是今天我收到错误AttributeError: 'bytes' object has no attribute 'encode'。

我通过运行 django-admin startproject newProject 创建了一个新的空白 django 实例。它以'ENGINE': 'django.db.backends.sqlite3' 运行。但是当我将其更改为 'ENGINE': 'django.db.backends.mysql'

时会产生相同的错误

系统规格:

os: manjaro linux
virtual environment python version: 3.6
Django version: 2.2
MariaDB version: 10.3.15-1

最近 3 天没有更新任何相关的包。

错误:

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/lib64/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib64/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/utils/autoreload.py", line 54, in wrapper
    fn(*args, **kwargs)
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/core/management/commands/runserver.py", line 120, in inner_run
    self.check_migrations()
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/core/management/base.py", line 453, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/migrations/executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/migrations/loader.py", line 49, in __init__
    self.build_graph()
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/migrations/loader.py", line 212, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/migrations/recorder.py", line 73, in applied_migrations
    if self.has_table():
  File "/srv/http/python/env/env36/lib/python3.6/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 "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/backends/base/base.py", line 256, in cursor
    return self._cursor()
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/backends/base/base.py", line 233, in _cursor
    self.ensure_connection()
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection
    self.connect()
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/backends/base/base.py", line 197, in connect
    self.init_connection_state()
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 232, in init_connection_state
    if self.features.is_sql_auto_is_null_enabled:
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/utils/functional.py", line 80, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/srv/http/python/env/env36/lib/python3.6/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 "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/backends/utils.py", line 103, in execute
    sql = self.db.ops.last_executed_query(self.cursor, sql, params)
  File "/srv/http/python/env/env36/lib/python3.6/site-packages/django/db/backends/mysql/operations.py", line 147, in last_executed_query
    query = query.encode(errors='replace')
AttributeError: 'bytes' object has no attribute 'encode'

我该如何解决这个问题?

【问题讨论】:

  • 当实际的 2.2.2 Django 版本使用 query.decode() 时,为什么您的回溯有 query.encode()?这完全使我的诊断无效,因为我错误地认为我正在查看 looking at the released version 的相同代码。您似乎已经更改了本地 Django 源代码,这也解释了为什么回溯将错误放在第 147 行而不是预期的第 146 行。
  • 感谢您的帮助和时间。我已经确认我的朋友在使用我的电脑时更改了它。我目前正在使用if not isinstance(query, bytes): query = query.encode(errors='replace') 如果有问题我会重新安装。再次感谢

标签: mysql django python-3.x


【解决方案1】:

感谢 Martijn,我已经解决了这个问题。 在源码中,django/db/backends/mysql/operations.py的稳定2.2支线146是

query = query.decode(errors='replace')

在我的系统中path/to/virtualenv/django/db/backends/mysql/operations.py 就像

# query = query.decode(errors='replace')
query = query.encode(errors='replace')

我改成

query = query.decode(errors='replace')
# query = query.encode(errors='replace')

现在可以正常工作了。

【讨论】:

  • 对,所以你真的想强制重新安装 Django,如果它已经被就地改变了,其他的一切:pip install —force-reinstall -r requirements.txt
  • 根据code.djangoproject.com/ticket/30380,在尝试使 PyMySQL 正常工作的尝试中(我会告知),该行可能已更改。在这种情况下,您需要在顶部添加from django.utils.encoding import force_text,然后使用query = force_string(query)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2021-04-23
相关资源
最近更新 更多