方法说明
Django2.2报错–AttributeError: ‘str’ object has no attribute 'decode’的解决方案,仅算是临时解决,所有更好的解决方案应该斟酌使用本方法
报错信息
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
注意
- 仅算是临时解决,所有更好的解决方案应该斟酌使用本方法
- 不要信网上说的,把decode改为encode