私は生産に入って以来、sqliteデータベースをより安定したpostgresqlに移行するために長い間努力してきました。私はいくつかの問題を抱えていましたが、私はロードブロッキングを犯しました。django sqliteデータベースからpostgresqlへの移行
バックアップを取得するには./manage.py dumpdata --exclude auth.permission --exclude contenttypes --natural-foreign > db.json
を実行し、settings.pyにsqliteを設定して実行しました。 PostgreSQLデータベースを構成した後は
./manage.py migrate
が
settings.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
エラーメッセージは 'web_tag.tag'が文字列であることを伝えていますが、' web_project_tags'の対応する列が整数であるため、PostgreSQLで 'varchar_column = integer_column'と言うことはできません。あなたは、タグ関係に型の問題があります。申し訳ありませんが、私は十分なPython/Djangoを教えて、それを修正する方法を教えていません。 –
ファイルがJSON形式で書き出されたように見えません。あなたが作成したものがSQLダンプであるように見えます。ほとんどの場合、デフォルトの形式はJSONです。エラーに記載されている行を抽出し、その行の両端に行を追加してください。 – e4c5
私はダンプをチェックし、jsonとしてエクスポートされました。ファイルはロードされ始めますが、@ mu-is-too-shortという問題があります。私はエラーが示唆するように列をキャストする方法があるはずだと思う、私はちょうど方法を見つけるように見えることができません。 – kerloom