2016-05-10 9 views
1

私は生産に入って以来、sqliteデータベースをより安定したpostgresqlに移行するために長い間努力してきました。私はいくつかの問題を抱えていましたが、私はロードブロッキングを犯しました。django sqliteデータベースからpostgresqlへの移行

バックアップを取得するには./manage.py dumpdata --exclude auth.permission --exclude contenttypes --natural-foreign > db.jsonを実行し、settings.pyにsqliteを設定して実行しました。 PostgreSQLデータベースを構成した後は

は、私は、PostgreSQLと ./manage.py migratesettings.pyで構成された走りました。

最後に、私は./manage.py loaddata db.jsonを実行し、次のエラーを得た:

django.db.utils.ProgrammingError: Problem installing fixture '/home/ubuntu/bl/loom/db.json': Could not load web.Project(pk=18): operator does not exist: character varying = integer 
LINE 1: ...INNER JOIN "web_project_tags" ON ("web_tag"."tag" = "web_pro... 
                  ^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

エラーが参照していることをモデル(s)は、次のコードがあります。

class Project(models.Model): 
    owner = models.ForeignKey(User, related_name='owner') 
    name = models.CharField(max_length=50) 
    img = models.ImageField("Cover", upload_to="img/projects", blank=True, null=True) 
    vid = models.URLField("Youtube Link", null=True, blank=True) 
    desc = models.TextField("Description", max_length=500) 
    stakeholders = models.ManyToManyField(Profile, related_name='stakeholders', blank=True) 
    industry = models.ManyToManyField(Industry, related_name="industry") 
    tags = models.ManyToManyField(Tag, related_name="project_tag") 
    is_private = models.BooleanField("Is this a private project?", default=False, help_text="Private projects are not shown on the index.") 
    b_type = models.ForeignKey(B_type, help_text="What type of project is this") 
    role = models.ForeignKey(Role, related_name="role") 
    deleted = models.BooleanField(default=False) 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     verbose_name = "Project" 
     verbose_name_plural = "Projects" 

class Tag(models.Model): 
    tag = models.CharField("Tag", max_length=100, primary_key =True) 

    def __unicode__(self): 
     return self.tag 

    class Meta: 
     verbose_name = "Tag" 
     verbose_name_plural = "Tags" 

を更新: ログファイルをより詳細なエラーが含まれており、完全なクエリが表示されます。

2016-05-09 00:54:39 UTC ERROR: operator does not exist: 
character varying = integer at character 89 
2016-05-09 00:54:39 UTC HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 
2016-05-09 00:54:39 UTC STATEMENT: SELECT "web_tag"."tag" FROM "web_tag" INNER JOIN "web_project_tags" ON ("web_tag"."tag" = "web_project_tags"."tag_id") WHERE "web_project_tags"."project_id" = 18 
+0

エラーメッセージは 'web_tag.tag'が文字列であることを伝えていますが、' web_project_tags'の対応する列が整数であるため、PostgreSQLで 'varchar_column = integer_column'と言うことはできません。あなたは、タグ関係に型の問題があります。申し訳ありませんが、私は十分なPython/Djangoを教えて、それを修正する方法を教えていません。 –

+0

ファイルがJSON形式で書き出されたように見えません。あなたが作成したものがSQLダンプであるように見えます。ほとんどの場合、デフォルトの形式はJSONです。エラーに記載されている行を抽出し、その行の両端に行を追加してください。 – e4c5

+0

私はダンプをチェックし、jsonとしてエクスポートされました。ファイルはロードされ始めますが、@ mu-is-too-shortという問題があります。私はエラーが示唆するように列をキャストする方法があるはずだと思う、私はちょうど方法を見つけるように見えることができません。 – kerloom

答えて

0

私はついにこの問題を解決しましたが、うまくいけば、この答えは誰かを助けるでしょう。

ログを確認した後、私はエラーを投げていたテーブルのpostgresqlデータベースをチェックしました。最新のバージョンに移行したにもかかわらず、web_project_tagsのデータ型が間違っていたことが判明しました。私は./manage.py loaddata db.jsonにデータをロードすることになった。これにより

ALTER TABLE problematic_table ALTER COLUMN problematic_column TYPE character varying(100); 

とこれ以上のエラー:私が使用して、このデータ型を修正しました。

関連する問題