Django2.2报错——AttributeError: ''str'' object has no attribute ''decode''

准备将 Django 连接到 MySQL,在命令行输入命令 python manage.py makemigrations 后报错: AttributeError: 'str' object has no attribute 'decode'

python 3中只有unicode str,所以把decode方法去掉了。你的代码中,f1已经是unicode str了,不用decode。
如果文件内容不是unicode编码的,要先以二进制方式打开,读入比特流,再解码。

方法说明

Django2.2报错–AttributeError: ‘str’ object has no attribute 'decode’的解决方案,仅算是临时解决,所有更好的解决方案应该斟酌使用本方法,可以根据错误提示找到文件位置,打开 operations.py 文件,找到以下代码:

报错信息

G:\book_pulisher>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
    fn(*args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\management\commands\runserver.py", line 120, in inner_run
    self.check_migrations()
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\management\base.py", line 453, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\migrations\loader.py", line 49, in __init__
    self.build_graph()
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\migrations\loader.py", line 212, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\migrations\recorder.py", line 73, in applied_migrations
    if self.has_table():
  File "C:\ProgramData\Anaconda3\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:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\base\base.py", line 256, in cursor
    return self._cursor()
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\base\base.py", line 233, in _cursor
    self.ensure_connection()
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\base\base.py", line 217, in ensure_connection
    self.connect()
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\base\base.py", line 197, in connect
    self.init_connection_state()
  File "C:\ProgramData\Anaconda3\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 "C:\ProgramData\Anaconda3\lib\site-packages\django\utils\functional.py", line 80, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\ProgramData\Anaconda3\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:\ProgramData\Anaconda3\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:\ProgramData\Anaconda3\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'

解决方案

我使用的是anaconda python,找到C:\ProgramData\Anaconda3\Lib\site-packages\django\db\backends\mysql\operations.py

因为这里是报错的语句,在145行,如下

    def last_executed_query(self, cursor, sql, params):
        # With MySQLdb, cursor objects have an (undocumented) "_executed"
        # attribute where the exact query sent to the database is saved.
        # See MySQLdb/cursors.py in the source distribution.
        query = getattr(cursor, '_executed', None)
        if query is not None:
            query = query.decode(errors='replace')
        return query

由此可看到,这里是一个if的判断,功能暂时不讨论,但是目前看是会触发这个if的,decode作为解码函数,那么可不可以直接返回,将145、146的if语句注释掉再尝试

    def last_executed_query(self, cursor, sql, params):
        # With MySQLdb, cursor objects have an (undocumented) "_executed"
        # attribute where the exact query sent to the database is saved.
        # See MySQLdb/cursors.py in the source distribution.
        query = getattr(cursor, '_executed', None)
        # if query is not None:
        #     query = query.decode(errors='replace')
        return query

再次启动项目,成功启动

G:\book_pulisher>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 03, 2019 - 20:35:51
Django version 2.2, using settings 'book_pulisher.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Not Found: /
[03/Apr/2019 20:35:53] "GET / HTTP/1.1" 404 3049
Not Found: /favicon.ico
[03/Apr/2019 20:35:53] "GET /favicon.ico HTTP/1.1" 404 3100
Not Found: /^publisher_list/
[03/Apr/2019 20:36:00] "GET /%5Epublisher_list/ HTTP/1.1" 404 3117
[03/Apr/2019 20:36:07] "GET /publisher_list/ HTTP/1.1" 200 7384
[03/Apr/2019 20:36:07] "GET /static/dashboard.css HTTP/1.1" 200 1557
[03/Apr/2019 20:36:07] "GET /static/fontawesome/css/font-awesome.min.css HTTP/1.1" 200 32422
[03/Apr/2019 20:36:07] "GET /static/bootstrap/js/bootstrap.min.js HTTP/1.1" 200 37045
[03/Apr/2019 20:36:07] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 200 121200
[03/Apr/2019 20:36:07] "GET /static/jquery-3.3.1.js HTTP/1.1" 200 271751
[03/Apr/2019 20:36:07] "GET /static/fontawesome/fonts/fontawesome-webfont.woff2?v=4.7.0 HTTP/1.1" 200 77160
[03/Apr/2019 20:36:10] "GET /book_list/ HTTP/1.1" 200 7426

 

注意

  • 仅算是临时解决,所有更好的解决方案应该斟酌使用本方法
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值