gpt4 book ai didi

python - Django - 连续的 dumpdata 调用失败,即使单独运行时工作正常

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:07 27 4
gpt4 key购买 nike

我在尝试在我的站点上设置自动备份时遇到了问题。问题归结为以下内容。

我打开 Python shell 并调用 dumpdata 命令两次。它第一次工作,第二次返回空列表。之后所有进一步的 dumpdata 调用返回空列表:

>>> python manage.py shell
>>> from django.core.management import call_command
>>> call_command("dumpdata")
[{"pk": 1, (...) // lots of data //
>>> call_command("dumpdata")
>>> []

为了让它再次工作,我需要重新启动 python shell。

编辑:我使用 Django 1.4 和 Python 2.6

Edit2:我目前的假设是这个问题与这个问题有关:https://code.djangoproject.com/ticket/5423 - 根据 Django 1.5 发行说明确定 5 年前,将在下一个版本中解决。有没有人知道如何在不改变机器上运行的 1.4 框架代码的情况下解决这个问题?

Edit3:然而,整个数据库的 sql 转储只有 0.5 MB,这使得序列化内存不足的可能性很小。无论如何,在这种情况下我不会得到一个明确的错误吗?

Edit4:谜团解开了。正如 Tomasz Gandor 正确确定的那样,问题是 shell 在一个事务中执行命令,并且在其中一个命令导致 DBError 之后,将忽略进一步的 DB 调用,如下所述:https://code.djangoproject.com/ticket/10813 .为什么没有明确报告第一次转储数据期间的数据库错误对我来说仍然是个谜。

最佳答案

我看到 django 正在处理事务。

我在调试器下执行了一个简单的例子:

# test.py
from django.core.management import call_command
call_command("dumpdata")
print "\n---"
call_command("dumpdata")
print

并这样调用它:

DJANGO_SETTINGS_MODULE=settings python test.py > log.txt

我的 log.txt 以“---\n[]\n”结尾

在我发现的调试器中运行它之后,深入django.core.management.commands.dumpdata.handle()model.objects.all() 不断返回 []。

我调用了 model.objects.iterator(),得到了异常:

(Pdb) list(model.objects.iterator())
*** Error in argument: '(model.objects.iterator())'
(Pdb) p list(model.objects.iterator())
*** DatabaseError: DatabaseError('current transaction is aborted, commands ignored until end of transaction block\n',)
(Pdb)

因此,我破解了与交易本身相关的代码:

# test.py version 2.0!

#!/usr/bin/env python
# from django.core.management import call_command
import django.core.management as mgmt
from django.db import transaction

'''
try:
import settings # Assumed to be in the same directory.
except ImportError:
import sys
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
sys.exit(1)
'''

@transaction.commit_manually
def main():
# mgmt.call_command('dumpdata', use_base_manager=True)
mgmt.call_command('dumpdata')
transaction.rollback()
print
print '---'
print
"""
mgmt._commands = None
import sys
reload(sys.modules['django.core.management.commands.dumpdata'])
"""
mgmt.call_command('dumpdata')
transaction.rollback()
print

if __name__ == "__main__":
main()

每次都会吐出整个数据库!

关于python - Django - 连续的 dumpdata 调用失败,即使单独运行时工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456760/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com