django loaddata由于并发数据库查询而失败

django loaddata由于并发数据库查询而失败,django,Django,我正在尝试将我的一个django项目的数据库从sqlite迁移到mysql。我首先用/manage.py dumpdata>dump.json转储了整个过程,并用/manage.py migrate准备了数据库,删除了表中创建的所有数据(这是必要的,因为转储保存了所有数据) 当我想使用/manage.py loaddata将数据导入新数据库时,我能够解决很多错误,但我找不到此错误的来源: Processed 330984 object(s).Traceback (most recent call

我正在尝试将我的一个django项目的数据库从sqlite迁移到mysql。我首先用
/manage.py dumpdata>dump.json
转储了整个过程,并用
/manage.py migrate
准备了数据库,删除了表中创建的所有数据(这是必要的,因为转储保存了所有数据)

当我想使用
/manage.py loaddata
将数据导入新数据库时,我能够解决很多错误,但我找不到此错误的来源:

Processed 330984 object(s).Traceback (most recent call last):
  File "/app/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.5/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.5/site-packages/django/core/management/__init__.py", line 355, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.5/site-packages/django/core/management/commands/loaddata.py", line 69, in handle
    self.loaddata(fixture_labels)
  File "/usr/local/lib/python3.5/site-packages/django/core/management/commands/loaddata.py", line 109, in loaddata
    self.load_label(fixture_label)
  File "/usr/local/lib/python3.5/site-packages/django/core/management/commands/loaddata.py", line 175, in load_label
    obj.save(using=self.using)
  File "/usr/local/lib/python3.5/site-packages/django/core/serializers/base.py", line 205, in save
    models.Model.save_base(self.object, using=using, raw=True, **kwargs)
  File "/usr/local/lib/python3.5/site-packages/django/db/models/base.py", line 837, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/usr/local/lib/python3.5/site-packages/django/db/models/base.py", line 904, in _save_table
    forced_update)
  File "/usr/local/lib/python3.5/site-packages/django/db/models/base.py", line 954, in _do_update
    return filtered._update(values) > 0
  File "/usr/local/lib/python3.5/site-packages/django/db/models/query.py", line 664, in _update
    return query.get_compiler(self.db).execute_sql(CURSOR)
  File "/usr/local/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1199, in execute_sql
    cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
  File "/usr/local/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 894, in execute_sql
    raise original_exception
  File "/usr/local/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 884, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.5/site-packages/django/db/backends/utils.py", line 60, in execute
    self.db.validate_no_broken_transaction()
  File "/usr/local/lib/python3.5/site-packages/django/db/backends/base/base.py", line 448, in validate_no_broken_transaction
    "An error occurred in the current transaction. You can't "
django.db.transaction.TransactionManagementError: Problem installing fixture '/path/to/django/dump.json': Could not load auth.User(pk=1): An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.
处理了330984个对象。回溯(最近一次调用):
文件“/app/manage.py”,第10行,在
从命令行(sys.argv)执行命令
文件“/usr/local/lib/python3.5/site packages/django/core/management/__init__.py”,第363行,从命令行执行
utility.execute()
文件“/usr/local/lib/python3.5/site packages/django/core/management/___init__.py”,执行中第355行
self.fetch_命令(子命令)。从_argv(self.argv)运行_
文件“/usr/local/lib/python3.5/site packages/django/core/management/base.py”,第283行,在运行中,从
self.execute(*args,**cmd_选项)
文件“/usr/local/lib/python3.5/site packages/django/core/management/base.py”,第330行,在execute中
输出=self.handle(*args,**选项)
handle中的文件“/usr/local/lib/python3.5/site packages/django/core/management/commands/loaddata.py”,第69行
self.loaddata(夹具标签)
loaddata中的文件“/usr/local/lib/python3.5/site packages/django/core/management/commands/loaddata.py”,第109行
自加载标签(夹具标签)
文件“/usr/local/lib/python3.5/site packages/django/core/management/commands/loaddata.py”,第175行,在load_标签中
对象保存(使用=自使用)
文件“/usr/local/lib/python3.5/site packages/django/core/serializers/base.py”,第205行,保存
models.Model.save_base(self.object,using=using,raw=True,**kwargs)
save_base中的文件“/usr/local/lib/python3.5/site packages/django/db/models/base.py”,第837行
更新=自我。保存表格(原始、cls、强制插入、强制更新、使用、更新字段)
文件“/usr/local/lib/python3.5/site packages/django/db/models/base.py”,第904行,在保存表中
强制更新)
文件“/usr/local/lib/python3.5/site packages/django/db/models/base.py”,第954行,在更新中
返回已筛选的。\u更新(值)>0
文件“/usr/local/lib/python3.5/site packages/django/db/models/query.py”,第664行,在更新中
返回query.get_编译器(self.db)。执行_sql(游标)
文件“/usr/local/lib/python3.5/site packages/django/db/models/sql/compiler.py”,第1199行,在execute_sql中
cursor=super(SQLUpdateCompiler,self)。执行sql(结果类型)
文件“/usr/local/lib/python3.5/site packages/django/db/models/sql/compiler.py”,第894行,在execute\u sql中
引发原始异常
文件“/usr/local/lib/python3.5/site packages/django/db/models/sql/compiler.py”,第884行,在execute_sql中
cursor.execute(sql,params)
文件“/usr/local/lib/python3.5/site packages/django/db/backends/utils.py”,执行中的第60行
self.db.validate\u no\u中断的\u事务()
文件“/usr/local/lib/python3.5/site packages/django/db/backends/base/base.py”,第448行,在validate\u no\u breaked\u事务中
“当前事务中发生错误。您无法”
django.db.transaction.TransactionManagementError:安装夹具“/path/to/django/dump.json”时出现问题:无法加载auth.User(pk=1):当前事务中发生错误。在“原子”块结束之前,无法执行查询。
我已经尝试删除所有信号接收器,以便在执行loaddata时不会运行我自己的代码

有没有其他人在django的
loaddata
中经历过类似的行为并设法使其正常工作

背景:

  • python v3.5
  • django v1.11.4
  • 仅使用stdlib django模型字段

    • 这与其说是一个解决方案,不如说是一个变通办法,但它确实解决了我的问题

      经过进一步调查,我意识到auth.user模型以某种方式触发了查询并中断了导入。 解决方案是编写一个简单的脚本,将转储拆分为多个部分(我不再有访问数据库的权限),然后按正确的顺序导入它们:
      contenttypes
      auth
      ,以及其他部分

      您可以找到脚本。
      这是我如何分割垃圾场的:

      ./investigate-django-dump.py dump.json extract contenttypes. > contenttypes.json
      ./investigate-django-dump.py dump.json extract auth. > auth.json
      ./investigate-django-dump.py dump.json extractnot auth.,contenttypes. > data.json
      

      这与其说是一个解决方案,不如说是一个变通办法,但它确实解决了我的问题

      经过进一步调查,我意识到auth.user模型以某种方式触发了查询并中断了导入。 解决方案是编写一个简单的脚本,将转储拆分为多个部分(我不再有访问数据库的权限),然后按正确的顺序导入它们:
      contenttypes
      auth
      ,以及其他部分

      您可以找到脚本。
      这是我如何分割垃圾场的:

      ./investigate-django-dump.py dump.json extract contenttypes. > contenttypes.json
      ./investigate-django-dump.py dump.json extract auth. > auth.json
      ./investigate-django-dump.py dump.json extractnot auth.,contenttypes. > data.json
      

      如果您可以使用Postgresql而不是Mysql,我认为它可以更优雅地处理并发性。我认为这个错误似乎与django有关,或者您认为使用Postgresql会使它消失吗?PG使用MVCC(多版本并发控制)。我猜现代Mysql实例可能会使用MVCC,但我不知道这是否是默认设置。Mysql 5.7(我正在使用)似乎使用MVCC()。这使得对Postgresql的更改不太可能解决这个问题——如果这是个问题的话。我支持Postgresql,我想你应该试试。也就是说,这只是一个观点,也是为什么这是一个评论而不是一个答案。如果你可以使用Postgresql而不是Mysql,我认为它可以更优雅地处理并发性。是的,事实上,我可以。我认为这个错误似乎与django有关,或者您认为使用Postgresql会使它消失吗?PG使用MVCC(多版本并发控制)。我想现代的Mysql实例可能会使用MVCC,但我不知道