在 Django 中,尝试转储数据时出现“错误:无法序列化数据库”?

Posted

技术标签:

【中文标题】在 Django 中,尝试转储数据时出现“错误:无法序列化数据库”?【英文标题】:In Django, getting a "Error: Unable to serialize database" when trying to dump data? 【发布时间】:2011-04-12 02:36:55 【问题描述】:

当我尝试将数据转储到我的实时服务器上的 Djanog 1.2.1 中的 JSON 固定装置时,我遇到了一个错误。在实时服务器上,它运行 mysql 服务器版本 5.0.77,我使用 phpMyAdmin 界面将大量数据导入到我的表中。该网站运行良好,Django 管理员正常响应。但是,当我尝试实际转储与表对应的应用程序数据时,我收到此错误:

$ python manage.py dumpdata --indent=2 gigs > fixtures/gigs_100914.json 
/usr/local/lib/python2.6/site-packages/MySQLdb/__init__.py:34: DeprecationWarning: the sets module is deprecated
  from sets import ImmutableSet
Error: Unable to serialize database: Location matching query does not exist.

我试图从中转储的“演出”的 Django 模型在 models.py 文件中如下所示:

from datetime import datetime
from django.db import models

class Location(models.Model):
    name = models.CharField(max_length=120, blank=True, null=True)

    class Meta:
        ordering = ['name']

    def __unicode__(self):
        return "%s (%s)" % (self.name, self.pk)

class Venue(models.Model):
    name = models.CharField(max_length=120, blank=True, null=True)
    contact = models.CharField(max_length=250, blank=True, null=True)
    url = models.URLField(max_length=60, verify_exists=False, blank=True, null=True) # because of single thread problems, I left this off (http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.URLField.verify_exists)

    class Meta:
        ordering = ['name']

    def __unicode__(self):
        return "%s (%s)" % (self.name, self.pk)

class Gig(models.Model):
    date = models.DateField(blank=True, null=True)
    details = models.CharField(max_length=250, blank=True, null=True)
    location = models.ForeignKey(Location)
    venue = models.ForeignKey(Venue)

    class Meta:
        get_latest_by = 'date'
        ordering = ['-date']

    def __unicode__(self):
        return u"%s on %s at %s" % (self.location.name, self.date, self.venue.name)

就像我说的,Django 对数据很好。该网站运行良好,关系似乎运行得非常好。当运行命令以获取 SQL Django 正在使用的内容时:

$ python manage.py sql gigs
/usr/local/lib/python2.6/site-packages/MySQLdb/__init__.py:34: DeprecationWarning: the sets module is deprecated
  from sets import ImmutableSet
BEGIN;CREATE TABLE `gigs_location` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `name` varchar(120)
)
;
CREATE TABLE `gigs_venue` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `name` varchar(120),
    `contact` varchar(250),
    `url` varchar(60)
)
;
CREATE TABLE `gigs_gig` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `date` date,
    `details` varchar(250),
    `location_id` integer NOT NULL,
    `venue_id` integer NOT NULL
)
;
ALTER TABLE `gigs_gig` ADD CONSTRAINT `venue_id_refs_id_3d901b6d` FOREIGN KEY (`venue_id`) REFERENCES `gigs_venue` (`id`);
ALTER TABLE `gigs_gig` ADD CONSTRAINT `location_id_refs_id_2f8d7a0` FOREIGN KEY (`location_id`) REFERENCES `gigs_location` (`id`);COMMIT;

我对数据进行了三次检查,确保所有关系和数据在导入后都正常。但是我仍然收到这个错误,三天后......我不知道该怎么做。我无法想象“弃用警告”在这里会成为问题。我真的需要将这些数据转储为 JSON。

非常感谢您的帮助。

【问题讨论】:

使用 --traceback 运行它以查看底层错误 您找到错误了吗?我遇到过类似的情况,试图转储通过inspectdb 获得的一堆模型...虽然我没有得到DoesNotExists(可能是由于较新的版本)。但是 django 无法查找现有的库... 【参考方案1】:

可能类似于this。

运行它:

python manage.py dumpdata --indent=2 -v 2 --traceback gigs 

查看潜在错误。

【讨论】:

【参考方案2】:

我曾经遇到过类似的问题,错误信息和你的一样令人着迷。原因是我的服务器内存不足。似乎在 json 中生成转储是相当昂贵的内存。我只有 60meg 的内存(在 djangohosting.ch 上),对于 mysql 转储只有 1meg 的 mysql DB 获得转储是不够的。

通过在第一个命令行中运行 manage.py dumpdata 时,我可以通过在第二个命令行中使用 top 命令观察 python 进程达到 60meg 限制来找出答案。

我的解决方案:获取 mysql 转储,然后将其加载到我的台式电脑上,然后再生成 json 转储。也就是说,出于备份目的,mysql 转储就足够了。

获取mysql转储的命令如下:

mysqldump -p [password] -u [username] [database_name] > [dump_file_name].sql

也就是说,您的问题可能完全不同。您应该真正查看具有指向您的 Location 表的外键的每个表,并检查是否没有指向先前删除的位置的字段。不幸的是,MySQL 在维护参照完整性方面非常糟糕,你不能指望它。

【讨论】:

【参考方案3】:

你可以--排除那个产生问题的特定应用程序,仍然会有数据库表,它对我有用

python manage.py dumpdata > backedup_data.json --exclude app_name

【讨论】:

以上是关于在 Django 中,尝试转储数据时出现“错误:无法序列化数据库”?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RSA 算法 Django Rest Framework 简单 JWT 时出现错误无法反序列化密钥数据

在汇编中进行除法时出现浮点异常(核心转储)

恢复 Django-mailer 数据库时出现 MySQL 错误 1118(行大小太大)

尝试声明大数组时出现分段错误和核心转储[重复]

尝试使用 Windows 7 为 Symfony2 项目转储资产时出现运行时异常

导入大 sql 转储时出现 PHPMYADMIN 错误