python运行时出现问题


"D:\tool\pycharm\PyCharm 2020.1.3\bin\runnerw64.exe" E:\python\python.exe E:/python/4Python全栈-2023-3-6/1/HighDjangoProject/manage.py runserver 8000
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 "E:\python\lib\threading.py", line 944, in _bootstrap_inner
    self.run()
  File "E:\python\lib\threading.py", line 882, in run
    self._target(*self._args, **self._kwargs)
  File "E:\python\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
    fn(*args, **kwargs)
  File "E:\python\lib\site-packages\django\core\management\commands\runserver.py", line 120, in inner_run
    self.check_migrations()
  File "E:\python\lib\site-packages\django\core\management\base.py", line 453, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "E:\python\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "E:\python\lib\site-packages\django\db\migrations\loader.py", line 49, in __init__
    self.build_graph()
  File "E:\python\lib\site-packages\django\db\migrations\loader.py", line 212, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "E:\python\lib\site-packages\django\db\migrations\recorder.py", line 73, in applied_migrations
    if self.has_table():
  File "E:\python\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 "E:\python\lib\site-packages\django\db\backends\base\base.py", line 256, in cursor
    return self._cursor()
  File "E:\python\lib\site-packages\django\db\backends\base\base.py", line 233, in _cursor
    self.ensure_connection()
  File "E:\python\lib\site-packages\django\db\backends\base\base.py", line 217, in ensure_connection
    self.connect()
  File "E:\python\lib\site-packages\django\db\backends\base\base.py", line 197, in connect
    self.init_connection_state()
  File "E:\python\lib\site-packages\django\db\backends\mysql\base.py", line 231, in init_connection_state
    if self.features.is_sql_auto_is_null_enabled:
  File "E:\python\lib\site-packages\django\utils\functional.py", line 80, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "E:\python\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 "E:\python\lib\site-packages\django\db\backends\utils.py", line 103, in execute
    sql = self.db.ops.last_executed_query(self.cursor, sql, params)
  File "E:\python\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'

query是个str,你继续往前找,找到前面什么时候给它赋值成str的
你这query = query.decode,总用同一个变量反复赋值不同的类型,是个坏习惯

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这个错误可能是因为 Python 3 不再支持 str 类型的 decode() 方法,但是 Django 的代码中调用了这个方法。

  • 建议尝试:升级 Django 到最新版本来解决这个问题,或者在 Django 的设置文件中将数据库后端设置为除 MySQL 外的其他数据库后端,比如 PostgreSQL。如果你必须要使用 MySQL 数据库后端,可以考虑使用 Python 2 运行 Django。

这个错误是由于 Python 3.x 中不再支持 str.decode() 方法,但是你的代码中使用了这个方法,导致了该异常。可能是因为你使用了一个在 Python 2.x 中编写的 Django 项目,而在 Python 3.x 中该方法被移除了。

为了解决这个问题,你需要查找代码中使用了 str.decode() 方法的地方,并将其替换为 Python 3.x 中的等价方法。在这种情况下,你可以使用 bytes.decode() 方法来替换 str.decode() 方法。你可以在 Python 3.x 文档中查找更多有关 bytes.decode() 方法的信息。

另外,你也可以考虑升级 Django 版本,以使其与 Python 3.x 兼容,这将消除这个问题,并让你能够充分利用 Python 3.x 中的新特性和功能。

这个错误信息是因为在 Django 的 MySQL 后端中,执行 cursor.execute() 时返回的 SQL 语句类型是 bytes,但是 last_executed_query() 函数中将其转换为了 str,然后尝试使用 decode() 方法进行解码,但是 str 类型并没有 decode() 方法,因此会出现 AttributeError 异常。
可以升级 Django 版本,或者使用 Python 3。在 Python 3 中,所有字符串都是 unicode 字符串,不再需要进行编码/解码的操作,因此也不会出现这个错误。

如果无法升级 Django 或 Python 版本,也可以尝试在使用 cursor.execute() 执行 SQL 语句时,使用 str.encode() 将字符串转换为 bytes 类型,以避免这个问题。例如:
sql = "SELECT * FROM mytable"
cursor.execute(sql.encode())