В Django появляется «Ошибка: невозможно сериализовать базу данных» при попытке выгрузить данные? - PullRequest
15 голосов
/ 14 сентября 2010

Я получаю сообщение об ошибке при попытке выгрузить данные в устройство JSON в Djanog 1.2.1 на моем работающем сервере. На живом сервере работает MySQL Server версии 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)

Как я уже сказал, Джанго в порядке с данными. Сайт работает нормально, и отношения, кажется, работают абсолютно нормально. Когда запускаете команду, чтобы узнать, что использует 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;

Я трижды проверил данные, проверил, чтобы все отношения и данные были в порядке после импорта. Но я все еще получаю эту ошибку, три дня спустя ... Я застрял в том, что с этим делать. Я не могу себе представить, что «DeprecationWarning» будет проблемой здесь. Мне действительно нужно вывести эти данные обратно в виде JSON.

Большое спасибо за любую помощь.

Ответы [ 2 ]

15 голосов
/ 14 сентября 2010

Может быть что-то похожее на this .

Запустите его с:

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

Чтобы увидеть основную ошибку.

4 голосов
/ 14 сентября 2010

Однажды я столкнулся с подобной проблемой, когда сообщение об ошибке было таким же завораживающим, как и ваше. Причиной была нехватка памяти на моем сервере. Кажется, что генерация дампов в json довольно дорогая память. У меня было только 60 мг памяти (в djangohosting.ch), и этого было недостаточно, чтобы получить дамп для базы данных mysql, для которой дамп mysql был всего 1 мг.

Я смог выяснить это, наблюдая, как процесс python достиг предела в 60 мегабайт, используя команду top во второй командной строке, в то время как во время запуска manage.py dumpdata в первой.

Мое решение: получите дамп mysql, а затем загрузите его на моем настольном ПК, прежде чем создавать дамп json. Тем не менее, для целей резервного копирования, дампов MySQL достаточно.

Команда для получения дампа mysql следующая:

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

Тем не менее, ваша проблема может быть совершенно другой. Вы должны действительно просмотреть каждую таблицу, которая имеет внешний ключ к вашей таблице Location, и проверить, нет ли поля, указывающего на ранее удаленное местоположение. К сожалению, MySQL очень плохо поддерживает ссылочную целостность, и вы не можете на это рассчитывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...