Django + MySQL - 管理站点 - 添加用户 - 操作错误 - 保存点不存在

2023-11-23

我们试图拥有一个自定义的用户模型和行为,但后来我们注意到,即使是默认 Django 安装通过 Django 管理员添加新用户时出现问题:

即使在其他 Django 版本中也会出现此问题(在 Django 中尝试过)1.8,以及最新的 Django1.11.3)。令人惊讶的是,使用 SQLite 或 PostgreSQL 数据库时不会出现此问题。另外,通过添加用户$./manage.py createuser并以编程方式工作。像以前创建的那样编辑现有用途admin通过终端的超级用户也可以工作。按预期进行小组工作的 CRUD 机制,因此只有Add User视野受到影响。

可能的故障点包括Django核心(任何版本),MySQL 二进制文件(捆绑在 XAMPP for Mac 中,也尝试了各种版本),或者MySQL-Python连接器(版本 1.2.5)。类似问题here,使用Django1.10和MySQL。

复制步骤:

  1. 安装最新的 Django 版本:$ pip install django

  2. 安装Python-MySQL驱动程序:$ pip install MySQL-python

  3. 创建一个新项目:$ django-admin.py startproject sandbox

  4. 在 MySQL 中创建一个新数据库并设置数据库配置settings.py

  5. 迁移 Django 应用程序的模型:$ ./manage.py migrate

  6. 创建一个admin超级用户:$ ./manage.py createsuperuser

  7. 运行 Django 的捆绑服务器:$ ./manage.py runserver

  8. Go to http://127.0.0.1:8000/admin/login,然后登录admin超级用户凭据。

  9. 尝试单击Users' Add按钮。将触发屏幕截图中附加的错误。

数据库查询日志示例:

Query   SET NAMES utf8
Query   set autocommit=1
Query   SELECT `django_session`.`session_key`, `django_session`.`session_data`, `django_session`.`expire_date` FROM `django_session` WHERE (`django_session`.`session_key` = 'ikql6mk9voxq4g0go9avuvuxxrpvwx9w' AND `django_session`.`expire_date` > '2017-07-10 06:58:15.823513')
Query   SELECT `auth_user`.`id`, `auth_user`.`password`, `auth_user`.`last_login`, `auth_user`.`is_superuser`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`date_joined` FROM `auth_user` WHERE `auth_user`.`id` = 1
Query   SAVEPOINT `s123145414516736_x1`
Query   RELEASE SAVEPOINT `s123145414516736_x1`
Query   ROLLBACK TO SAVEPOINT `s123145414516736_x1`
Query   rollback
Query   set autocommit=1
Quit

看来 SAVEPOINT ROLLBACK 是在 SAVEPOINT RELEASE 之后完成的,导致 SAVEPOINT 丢失。基于MySQL 的 SavePoint 文档,自然顺序似乎是 ROLLBACK 然后 RELEASE。

这是回溯消息。 Django 的默认值没有其他变化settings.py除了用于连接 MySQL 服务器的数据库配置/凭据:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/admin/auth/user/add/

Django Version: 1.11.3
Python Version: 2.7.8
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/contrib/admin/options.py" in wrapper
  551.                 return self.admin_site.admin_view(view)(*args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  57.         response = view_func(request, *args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner
  224.             return view(request, *args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper
  67.             return bound_func(*args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/views/decorators/debug.py" in sensitive_post_parameters_wrapper
  76.             return view(request, *args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func
  63.                 return func.__get__(self, type(self))(*args2, **kwargs2)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper
  67.             return bound_func(*args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func
  63.                 return func.__get__(self, type(self))(*args2, **kwargs2)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/contrib/auth/admin.py" in add_view
  103.             return self._add_view(request, form_url, extra_context)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/contrib/auth/admin.py" in _add_view
  131.                                                extra_context)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/contrib/admin/options.py" in add_view
  1508.         return self.changeform_view(request, None, form_url, extra_context)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper
  67.             return bound_func(*args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func
  63.                 return func.__get__(self, type(self))(*args2, **kwargs2)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/contrib/admin/options.py" in changeform_view
  1408.             return self._changeform_view(request, object_id, form_url, extra_context)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/db/transaction.py" in __exit__
  210.                                 connection.savepoint_rollback(sid)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/db/backends/base/base.py" in savepoint_rollback
  348.         self._savepoint_rollback(sid)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/db/backends/base/base.py" in _savepoint_rollback
  308.             cursor.execute(self.ops.savepoint_rollback_sql(sid))

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/db/backends/utils.py" in execute
  80.             return super(CursorDebugWrapper, self).execute(sql, params)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/db/backends/utils.py" in execute
  65.                 return self.cursor.execute(sql, params)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/db/utils.py" in __exit__
  94.                 six.reraise(dj_exc_type, dj_exc_value, traceback)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/db/backends/utils.py" in execute
  63.                 return self.cursor.execute(sql)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/django/db/backends/mysql/base.py" in execute
  101.             return self.cursor.execute(query, args)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/MySQLdb/cursors.py" in execute
  205.             self.errorhandler(self, exc, value)

File "/Users/ranelpadon/.virtualenvs/django__1_11/lib/python2.7/site-packages/MySQLdb/connections.py" in defaulterrorhandler
  36.     raise errorclass, errorvalue

Exception Type: OperationalError at /admin/auth/user/add/
Exception Value: (1305, 'SAVEPOINT s123145452511232_x1 does not exist')

这个bug困扰了我很长时间,所以我决定进一步挖掘并尝试一劳永逸地解决它。

根本原因:SAVEPOINT 问题是一个错误,仅发生在MySQL-Python连接器。

使固定: 使用其他适用于 Python 的 MySQL 驱动程序(例如mysqlclient).

详细信息/调查结果:

  • 尝试了 Homebrew、MAMP 和 XAMPP for Mac 中的 MySQL 二进制文件。
  • 尝试了各种MySQL版本,5.6(libmysqlclient.18.dylib)和 5.7(libmysqlclient.20.dylib).
  • 尝试了各种Python的MySQL驱动程序。

通过改变 MySQL 二进制文件/版本未发现任何关系。但我通过测试 Python 中常用的各种 MySQL 驱动程序缩小了问题范围:

  1. MySQLdb(广泛使用但旧的数据库连接器,最后一次提交是 7 年前!):

    $ pip install MySQL-python

  2. mysql客户端(现代版本的MySQL-python,但有很多错误修复和改进):

    $ pip install mysqlclient

  3. PyMySQL(纯Python MySQL数据库驱动):

    $ pip install PyMySQL

    然后,添加settings.py(就在下面import os):

    try:
        import pymysql
        pymysql.install_as_MySQLdb()
    except:
        pass
    
  4. MySQL-连接器-Pythonby Oracle(纯Python MySQL数据库驱动):

    $ pip install mysql-connector-python-rf

    然后,编辑数据库的ENGINE配置在settings.py:

    'ENGINE': 'mysql.connector.django',
    

仅当使用MySQL-python连接器(#1 驱动程序),但不在其他驱动程序(#2、#3、#4 驱动程序)中。就我而言,我选择了mysql客户端。现在问题已经消失了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django + MySQL - 管理站点 - 添加用户 - 操作错误 - 保存点不存在 的相关文章

随机推荐

  • 为什么 SwitchPreference 在从打开切换到关闭时不显示动画,反之亦然?

    我做了一个SwitchPreference对于我的应用程序preferences 问题是SwitchPreference当我在打开和关闭之间切换时 它没有显示动画 而是突然猛烈地切换 Here s preferences xml文件的代码
  • 有关 Android 的 Movie 类的信息

    我正在尝试展示一个 gif 动画 顺便说一句 我正在与班级一起做Movie 但 Android 开发者页面不授予有关这些方法的信息 如何调整 gif 的大小以适应布局 提前致谢 我一直在尝试使用做同样的事情 显示动画 GIF this me
  • NumPy有相当于Matlab缓冲区的功能吗?

    我看到有一个array split and split methods但是 当您必须分割长度不是块大小整数倍的数组时 这些并不是很方便 此外 这些方法的输入是切片数量而不是切片大小 我需要一些更像 Matlab 的东西buffer更适合信号
  • mysql中的数组变量

    MySQL 脚本中有没有办法声明一个数组 或任何集合 并循环它来执行操作 例如 SET myArrayOfValue 2 5 2 23 6 for each value in myArrayOfValue INSERT INTO EXEMP
  • 如何在谷歌地图v2的默认标记中绘制文本

    我想在 Google 地图 v2 的默认标记中绘制文本 我通过从可绘制图像中获取自己的图像来完成此操作 但如何在默认标记中更改它 我的代码是 marker icon BitmapDescriptorFactory fromBitmap dr
  • Excel 过滤功能 - 选择某些列作为输出

    我想对多个列应用过滤器函数 范围从A G并且只有列B D在输出中 我该怎么做 例如 FILTER A 1 G 7 K 1 K 7 K 1 结果是匹配条件的行的溢出数组 但输出仍然有 7 列 A G 我可以选择只输出Column吗B D TL
  • ImageMagick.NET 异常

    我得到了FileNotFoundException当尝试使用 ImageMagick NET 时 取自源代码中的 bin 文件夹 http imagemagick codeplex com releases view 30302 我得到的确
  • chrome.storage 设置\获取说明

    我想在我的扩展中保存信息 我用Chrome storage sync这样做 但是当我保存后立即阅读时 我无法正确检索该值 大概是做了什么蠢事吧 我尝试清除本地存储chrome storage sync clear但这没有帮助 我的保存功能是
  • 使用 .htaccess 密码保护单个文件

    我尝试使用 htaccess 对单个文件进行密码保护 但是 当访问该文件时 浏览器只会重定向到网站的主页 我的 webroot 上有 htpasswd 我的 htaccess 文件如下
  • 在 SQL Server 2005 中,如何设置整数列以确保值大于 0?

    这可能是一个简单的答案 但我找不到它 我有一个包含整数列的表 我想确保插入行时该列中的值大于零 我可以在代码方面执行此操作 但认为最好在桌面上强制执行它 Thanks 我上次的评论是错误的 现在一切都很好 您可以在列上使用检查约束 IIRC
  • 隐藏 ag-grid 中的列名称?

    是否可以隐藏 ag grid 中的第一行 列定义 我只想显示表中的数据并排除列标题 你可以加headerHeight组件上的属性并将其设置为 0 这将隐藏标头 就像这样
  • R:shapefile 上的梯度图

    我目前有一个英国的形状文件 并绘制了英国不同地区的物种数量 到目前为止 我刚刚绘制了 3 个物种种群水平 并将它们着色为红色 高 橙色 中 绿色 低 但我想做的是绘制一个渐变图 而不是仅受 3 种颜色的限制 到目前为止 我有一个名为 计数
  • VS2010 中的 Magick++ - 无法解析的外部符号

    我正在尝试在 VS2010 中使用 ImageMagick Magick 进行 C 项目 我从这里安装了库 klick 然后在我的项目中 我将 c program files ImageMagick 6 6 6 Q16 include 添加
  • 为什么 PHP 认为 0 等于字符串?

    我有以下代码 item price 0 Code to get item information goes in here if item price e item price 1 其目的是将商品价格初始化为 0 然后获取有关它的信息 如果
  • 为 MKOverlayView 制作动画

    我有一个 MKOverlayView 它将动画雷达数据显示为一系列图像 我遇到的问题是雷达图像被 MapKit 切成图块 为了交换图像 我有一个计时器 它调用更新函数 该函数在叠加层中设置当前图像 然后调用以下命令 myRadarOverl
  • 涉及具有易失性变量的表达式的简单语句的正确行为?

    考虑以下陈述 volatile int a 7 a statement A volatile int b a b statement B volatile int c a c statement C 现在 我一直试图在标准中找到一个点 告诉
  • JAXB 在全局范围内将空字符串编组为 Null

    我的问题非常类似于当字符串为空但不为空时 如何防止在 JAXB 中编组空标签 不同之处在于 我无法将注释添加到 package info java 因为我们所有的 JAXB 类型都是从每次构建的模式生成的 如果可能的话 我也更愿意不更改 J
  • 如何在 Node 中逐行读取 stdin

    我正在寻找使用命令行调用来处理带有节点的文本文件 例如 node app js lt input txt 文件的每一行都需要单独处理 但处理后输入行可能会被忘记 使用标准输入的数据监听器 我将输入流按字节大小分块 因此我进行了设置 proc
  • 如何将焦点添加到 WPF 中的可编辑组合框

    我在 wpf 中使用可编辑的组合框 但是当我尝试从 C 代码设置焦点时 它只显示选择 但我想选择编辑选项 光标应显示以供用户输入 你可以试试这个代码 var textBox comboBox Template FindName PART E
  • Django + MySQL - 管理站点 - 添加用户 - 操作错误 - 保存点不存在

    我们试图拥有一个自定义的用户模型和行为 但后来我们注意到 即使是默认 Django 安装通过 Django 管理员添加新用户时出现问题 即使在其他 Django 版本中也会出现此问题 在 Django 中尝试过 1 8 以及最新的 Djan