簡體   English   中英

django loaddata由於並發數據庫查詢而失敗

[英]django loaddata fails because of concurrent database query

我正在嘗試將我的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.

我已經嘗試刪除所有信號接收器,以便在執行loaddata時不運行我自己的代碼。

django的loaddata是否有其他人遇到過類似的行為並設法使其正常工作?

內容:

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

這不是解決方案,而是解決方法,但這確實解決了我的問題。

經過進一步調查,我意識到auth.user模型以某種方式觸發了查詢並破壞了導入。 解決方案是編寫一個簡單的腳本,將轉儲分為多個部分(我再也無法訪問數據庫了),然后以正確的順序導入它們: contenttypesauth和其余部分。

您可以在此處找到腳本。
這是我拆分轉儲的方式:

./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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM