programing

장고에서는 에러:데이터를 덤프할 때 데이터베이스를 직렬화할 수 없습니다.

goodsources 2023. 2. 22. 21:50
반응형

장고에서는 에러:데이터를 덤프할 때 데이터베이스를 직렬화할 수 없습니다.

라이브 서버의 Djanog 1.2.1의 JSON 픽스쳐에 데이터를 덤프하려고 하면 에러가 발생합니다.라이브 서버에서는 MySQL Server 버전 5.0.77을 실행하고 있으며 phpMyAdmin 인터페이스를 사용하여 많은 데이터를 테이블로 Import했습니다.웹사이트는 정상적으로 동작하며, 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.

덤프하려는 'gigs'의 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;

데이터를 세 번 체크하고 Import 후 모든 관계와 데이터가 정상인지 확인했습니다.하지만 3일이 지나도 여전히 오류가 발생하고 있습니다.나는 그것에 대해 어떻게 해야 할지 막막하다.'불황 경고'가 여기서 문제가 될 거라고는 생각할 수 없습니다.이 데이터를 다시 JSON으로 폐기해야 합니다.

도와주셔서 정말 감사합니다.

이것과 비슷한 것일 수도 있어요.

실행 방법:

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

기본 오류를 확인합니다.

한번은 비슷한 문제에 부딪힌 적이 있는데, 오류 메시지가 당신처럼 매혹적이었습니다.서버의 메모리 부족이 원인입니다.json에서 덤프를 생성하는 것은 메모리 비용이 많이 드는 것 같습니다.메모리 용량은 60메가(djangohosting.ch)밖에 없었고 mysql 덤프가 100메가밖에 되지 않는 mysql DB용 덤프를 얻기에는 충분하지 않았습니다.

첫 번째 명령행에서 manage.py dumpdata를 실행하면서 python 프로세스가 두 번째 명령행에서 top 명령어를 사용하여 60메가 제한에 도달하는 것을 보고 알 수 있었습니다.

해결 방법: mysql 덤프를 가져와 json 덤프를 생성하기 전에 데스크톱 PC에 로드합니다.즉, 백업을 위해 mysql 덤프만 있으면 됩니다.

mysql 덤프를 가져오는 명령어는 다음과 같습니다.

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

단, 당신의 문제는 완전히 다를 수 있습니다.Location 테이블에 대한 외부 키가 있는 모든 테이블을 살펴보고 이전에 삭제된 위치를 가리키는 필드가 없는지 확인해야 합니다.안타깝게도 MySQL은 참조 무결성을 유지하는 데 매우 서툴러서 신뢰할 수 없습니다.

문제를 일으키고 있는 특정 앱을 찾을 수 있지만 데이터베이스 테이블이 있을 것입니다.그것은 나에게 효과가 있었습니다.

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

이 오류는 DB의 스키마와 모델 간에 불일치가 있기 때문에 나타납니다.

수동으로 찾거나 설치하기만 하면 됩니다.

pip install django-extensions

명령어를 사용하여 문제의 정확한 위치를 출력합니다.

python manage.py sqldiff -a -t

우선, 모델을 DB와 일치시킵니다.그런 다음 마이그레이션 및 위장 마이그레이션을 실행합니다.

python manage.py makemigrations && python manage.py migrate --fake

그것만으로도 쓰레기장을 운영할 수 있을 거야django는 DB의 스키마가 모델과 일치하는지 확인하는 즉시 사용자에게 알려줍니다.

다음으로 모델을 업데이트하고 평소대로 마이그레이션을 다시 실행할 수 있습니다.

python manage.py makemigrations && python manage.py migrate

언급URL : https://stackoverflow.com/questions/3708119/in-django-getting-a-error-unable-to-serialize-database-when-trying-to-dump-d

반응형