执行转储数据时对“错误:无法序列化数据库:”进行故障排除

Posted

技术标签:

【中文标题】执行转储数据时对“错误:无法序列化数据库:”进行故障排除【英文标题】:Troubleshooting "Error: Unable to serialize database:" when performing dumpdata 【发布时间】:2011-10-04 13:10:51 【问题描述】:

由于某些原因,今天我无法使用python manage.py dumpdata 或从可以下载 mysql 文件的链接转储我的数据库。

我尝试使用python manage.py dumpdata --traceback,这是我掌握的信息。

Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/dumpdata.py", line 114, in handle
    use_natural_keys=use_natural_keys)
  File "/usr/local/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 91, in serialize
    s.serialize(queryset, **options)
  File "/usr/local/lib/python2.7/site-packages/django/core/serializers/base.py", line 48, in serialize
    self.handle_fk_field(obj, field)
  File "/usr/local/lib/python2.7/site-packages/django/core/serializers/python.py", line 48, in handle_fk_field
    related = getattr(obj, field.name)
  File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 301, in __get__
    raise self.field.rel.to.DoesNotExist
django.contrib.auth.models.DoesNotExist

上面写着django.contrib.auth.models.DoesNotExist。我想知道它是否与外键或其他东西有关。

models.py

class Client(models.Model):
    name = models.CharField(max_length = 40)
    telephone = models.CharField(max_length = 20)
    website = models.URLField(verify_exists = False)
    fax = models.CharField(max_length = 20)
    email = models.EmailField()
    is_active = models.BooleanField()
    user  = models.ForeignKey(User)
    datetime = models.DateTimeField(default=datetime.now)
    note = models.TextField()
    def __unicode__(self):
        return self.name

在我的 models.py 中,最近添加了字段用户、日期时间和注释。现在,如果对于客户,这些字段中的任何一个都没有值,即空白,我将收到错误 Unable to serialize database

当我在 mysql 中查找用户、日期时间和注释时。 Client 的表显示了 user_id、datetime 和 note 以具有 Null 值(这是我想要的)。为什么它不允许 Null 值?

+-----------+-------------+------+-----+--------- +----------------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +-----------+-------------+------+-----+--------- +----------------+ |编号 |整数(11) |否 |优先级 |空 |自动增量 | |姓名 | varchar(40) |否 | |空 | | |电话 | varchar(20) |否 | |空 | | |网站 | varchar(200) |否 | |空 | | |传真 | varchar(20) |否 | |空 | | |电子邮件 | varchar(75) |否 | |空 | | | is_active |小整数(1) |否 | |空 | | |用户 ID |整数(11) |是 |穆尔 |空 | | |日期时间 |日期时间 |是 | |空 | | |注意 |长文 |是 | |空 | | +-----------+-------------+------+-----+--------- +----------------+

【问题讨论】:

外键问题听起来不错。您的任何模型都有指向 django.contrib.auth.models 中模型的 ForeignKey 字段? 我第二个@tcarobruce。这听起来像是外键或约束问题。由于缺少 South 或手动未正确修改的键或约束,我遇到过类似的情况。 self.handle_fk_field(obj, field) 有点赠品 正如其他人所说,您的表中很可能缺少一些外键元素。我也遇到过这个问题。您始终可以从另一个模型转储数据,以查看此问题是否仅针对一个模型。 【参考方案1】:

您需要告诉 Django,它应该允许在最近添加的字段上使用 NULL 值。它只查看字段定义,不从数据库中获取模式。

self.field.rel.to.DoesNotExist 错误最有可能在客户端没有关联用户并且访问 client.user 时引发。这是因为默认情况下所有字段都是必需的。如果您更改模型定义,如下所示,错误应该会消失。

class Client(models.Model):
    # ...
    user  = models.ForeignKey(User, 
                             null=True, blank=True) 
    datetime = models.DateTimeField(default=datetime.now,
                             null=True, blank=True)
    note = models.TextField(null=True, blank=True)
null=True 允许 NULLNone 字段上的值。 blank=True 允许您在模型表单中将该字段留空 (例如,在管理员中)。

blanknull默认都是False

【讨论】:

以上是关于执行转储数据时对“错误:无法序列化数据库:”进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

数据库学习之数据库恢复的实现--各种数据转储方法

为啥在数据库中执行结果时对,但出不来数据

处理高频数据时创建数据转储的最佳方法

在存储或显示时对用户输入进行 HTML 编码

在新数据到达 Meteor 时对其进行动画处理

添加新服务器时对 Cassandra 中的数据进行重新分区