Django user.save()在列“ is_superuser”上失败不能为空

时间:2019-08-12 21:12:26

标签: python mysql django python-3.x mysql-connector-python

我正在尝试使用以下代码更新用户密码:

from django.contrib.auth.models import User
u = User.objects.get(username='test')
u.set_password('test')
u.save()

但是每次出现这些错误时都会失败(没有来自整个错误消息的长消息):

  • _mysql_connector.MySQLInterfaceError: Column 'is_superuser' cannot be null
  • mysql.connector.errors.IntegrityError: 1048 (23000): Column 'is_superuser' cannot be null
  • django.db.utils.IntegrityError: Column 'is_superuser' cannot be null
  • AttributeError: 'NoneType' object has no attribute 'strip'

我很困惑,因为此代码来自官方网站,因此错误可能在django和mysql之间。

感谢前进


编辑:

代码和完整的错误消息:

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('jj', 'lennon@thebeatles.com', 'johnpassword')
>>> user.save()
>>> u = User.objects.get(username='jj')
>>> print(u.is_superuser)
None
>>> u.save()
Traceback (most recent call last):
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/connection_cext.py", line 395, in cmd_query
    raw_as_string=raw_as_string)
_mysql_connector.MySQLInterfaceError: Column 'is_superuser' cannot be null

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/django/base.py", line 168, in _execute_wrapper
    return method(query, args)
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/cursor_cext.py", line 266, in execute
    raw_as_string=self._raw_as_string)
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/connection_cext.py", line 398, in cmd_query
    sqlstate=exc.sqlstate)
mysql.connector.errors.IntegrityError: 1048 (23000): Column 'is_superuser' cannot be null

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/backends/utils.py", line 99, in execute
    return super().execute(sql, params)
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/django/base.py", line 218, in execute
    return self._execute_wrapper(self.cursor.execute, query, new_args)
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/django/base.py", line 174, in _execute_wrapper
    utils.IntegrityError(err.msg), sys.exc_info()[2])
  File "home/mm/test/.env/lib/python3.7/site-packages/django/utils/six.py", line 683, in reraise
    raise value.with_traceback(tb)
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/django/base.py", line 168, in _execute_wrapper
    return method(query, args)
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/cursor_cext.py", line 266, in execute
    raw_as_string=self._raw_as_string)
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/connection_cext.py", line 398, in cmd_query
    sqlstate=exc.sqlstate)
django.db.utils.IntegrityError: Column 'is_superuser' cannot be null

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/cursor_cext.py", line 606, in statement
    return self._executed.strip().decode('utf8')
AttributeError: 'NoneType' object has no attribute 'strip'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "home/mm/test/.env/lib/python3.7/site-packages/django/contrib/auth/base_user.py", line 66, in save
    super().save(*args, **kwargs)
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/models/base.py", line 741, in save
    force_update=force_update, update_fields=update_fields)
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/models/base.py", line 779, in save_base
    force_update, using, update_fields,
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/models/base.py", line 851, in _save_table
    forced_update)
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/models/base.py", line 900, in _do_update
    return filtered._update(values) > 0
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/models/query.py", line 760, in _update
    return query.get_compiler(self.db).execute_sql(CURSOR)
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1429, in execute_sql
    cursor = super().execute_sql(result_type)
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1100, in execute_sql
    cursor.execute(sql, params)
  File "home/mm/test/.env/lib/python3.7/site-packages/django/db/backends/utils.py", line 103, in execute
    sql = self.db.ops.last_executed_query(self.cursor, sql, params)
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/django/operations.py", line 127, in last_executed_query
    return force_text(cursor.statement, errors='replace')
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/django/base.py", line 230, in __getattr__
    return getattr(self.cursor, attr)
  File "home/mm/test/.env/lib/python3.7/site-packages/mysql/connector/cursor_cext.py", line 608, in statement
    return self._executed.strip()
AttributeError: 'NoneType' object has no attribute 'strip'

来自auth_user的Mysql行:

| id | password                                                                       | last_login                 | is_superuser | username | first_name | last_name | email                 | is_staff | is_active | date_joined                |
+----+--------------------------------------------------------------------------------+----------------------------+--------------+----------+------------+-----------+-----------------------+----------+-----------+----------------------------+
| 16 | pbkdf2_sha256$150000$0gJWVPgCXeadjdfhdjslskfzurBD$yrWlrHM8foMnTm0MpDJ6yxv0/PI= | NULL                       |            0 | jj       |            |           | lennon@thebeatles.com |        0 |         1 | 2019-08-12 21:43:49.021511 |

2 个答案:

答案 0 :(得分:2)

因此,该错误似乎是由于mysql引擎mysql.connector.django引起的。使用mysqlclient安装pip install mysqlclient并将ENGINE内的settings.py更改为django.db.backends.mysql后,一切正常!

答案 1 :(得分:0)

您可以通过在数据库'use_pure':True中使用OPTIONS来修复该错误:

DATABASES = {
    'default': {
        'ENGINE': 'mysql.connector.django',
        'NAME': '<set>',
        'USER': '<set>',
        'PASSWORD': '<set>',
        'OPTIONS': {
            'use_pure':True
        },
    }
}

感谢Ciaran O'Sullivan找到了解决方法:https://bugs.mysql.com/bug.php?id=92001

该解决方案也对我有用。

P.S。 use_pure意味着mysql-connector将使用纯python连接,而不是其C扩展名(我认为是Bug所在)。 https://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html

P.P.S该错误已出现在8.0.13版中,该版本增加了对python3.7的支持:https://dev.mysql.com/doc/relnotes/connector-python/en/news-8-0-13.html