32

ライブ サーバーの Djanog 1.2.1 で JSON フィクスチャにデータをダンプしようとすると、エラーが発生します。ライブ サーバーでは MySQL サーバー バージョン 5.0.77 を実行しており、phpMyAdmin インターフェイスを使用してテーブルに大量のデータをインポートしました。Web サイトは正常に機能し、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)

私が言うように、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;

データをトリプルチェックし、インポート後にすべての関係とデータが正常であることを確認しました。しかし、3 日経ってもまだこのエラーが発生します... どうすればいいのか困っています。ここで「DeprecationWarning」が問題になるとは想像できません。このデータを JSON としてダンプする必要があります。

助けてくれてありがとう。

4

3 に答える 3

26

これに似たものである可能性があります。

次のように実行します。

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

根本的なエラーを表示します。

于 2010-09-14T12:24:11.223 に答える
4

エラーメッセージがあなたのものと同じくらい魅力的であるという同様の問題に遭遇したことがあります。原因は、サーバーのメモリ不足でした。json でダンプを生成すると、メモリがかなり消費されるようです。私は (djangohosting.ch で) 60 メガバイトしかメモリを持っていませんでしたが、mysql ダンプが 1 メガグラムしかない mysql DB のダンプを取得するには十分ではありませんでした。

最初のコマンドラインでmanage.py dumpdataを実行しているときに、2番目のコマンドラインでtopコマンドを使用してpythonプロセスが60メガの制限に達するのを見て、見つけることができました。

私の解決策:jsonダンプを生成する前に、mysqlダンプを取得してデスクトップPCにロードします。とはいえ、バックアップ目的であれば、mysql ダンプで十分です。

mysql ダンプを取得するコマンドは次のとおりです。

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

とはいえ、あなたの問題はまったく異なる可能性があります。Location テーブルへの外部キーを持つすべてのテーブルを実際に調べて、以前に削除された場所を指すフィールドがないかどうかを確認する必要があります。残念ながら、MySQL は参照整合性を維持するのが非常に苦手であり、信頼することはできません。

于 2010-09-14T13:02:44.827 に答える
0

問題を引き起こしている特定のアプリを除外することができますが、それでもデータベーステーブルが存在します。それは私にとってはうまくいきました

python manage.py dumpdata > backedup_data.json --exclude app_name
于 2021-04-12T11:15:10.123 に答える