【问题标题】:Error when migrate - psycopg2 Django迁移时出错 - psycopg2 Django
【发布时间】:2017-03-16 17:57:51
【问题描述】:

我正在尝试在服务器上部署本地工作,但是当我在 python manage.py 上运行 migrate 时遇到 psycopg2 问题。

设置:

    DATABASES = {
    'default':{
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '******',
        'USER': '*****',
        'PASSWORD': '**********',
        'HOST': '*******',
        'PORT': '5432'
    }
}

有问题的模型

class user(AbstractBaseUser, PermissionsMixin):
   created = models.DateTimeField(auto_now_add=True)
   first_name = models.CharField(max_length=50)
   last_name = models.CharField(max_length=50)
   email = models.EmailField(unique=True)
   street = models.CharField(max_length=100, null=True, blank=True)
   street_num = models.CharField(max_length=10, null=True, blank=True)
   unit_num = models.CharField(max_length=10, null=True, blank=True)
   city = models.CharField(max_length=50, null=True, blank=True)
   postal_code = models.CharField(max_length=10, null=True, blank=True)
   state = models.ForeignKey(state, null=True, blank=True)
   country = models.ForeignKey(country, null=True, blank=True)
   phone = models.CharField(max_length=50, null=True, blank=True)

   is_staff = models.BooleanField(default=False)
   is_active = models.BooleanField(default=True)
   .....

class country(models.Model):
    name = models.CharField(max_length=50)
    code = models.CharField(max_length=10)


class State(models.Model):
    country = models.ForeignKey(country, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    short_name = models.CharField(max_length=3)
    group = models.CharField(max_length=2, null=True, blank=True, choices=GROUP_TYPE)
    properties = models.ForeignKey(stateProperties, null=True, blank=True)

迁移文件: ...

            ('brand', models.CharField(blank=True, max_length=30, null=True)),
            ('exp_month', models.CharField(blank=True, max_length=2, null=True)),
            ('exp_year', models.CharField(blank=True, max_length=2, null=True)),
            ('country', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='common.country')),
            ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
            ('state', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='common.state')),

.....

ERROR:
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying profile.0001_initial...Traceback (most recent call last):
  File "/home/instantuser/app/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: relation "common_country" does not exist


**django.db.utils.ProgrammingError: relation "common_country" does not exist**

我在这里错过了什么?

【问题讨论】:

  • 为什么您认为是用户模型导致了问题?你也可以展示你的国家模型吗?另外,这两个模型都在同一个 django 应用程序中吗?
  • @MananMehta 嘿,因为这个:正在应用 profile.0001_initial 。使用 sqlite 开发服务器在本地一切正常。这只发生在我使用 psycopg2 时。但我也添加了国家模式
  • @AndreMendes 你试过我在答案中建议的吗?

标签: python django postgresql psycopg2


【解决方案1】:

我发现了问题。这是我的错误。我有一个 .gitignore 设置为忽略迁移文件和文件夹。所以 Country 所在的迁移文件夹没有被发送到 master 分支。

它是固定的。谢谢你的帮助。

【讨论】:

  • 感谢您的自我回答。就我而言,它在本地环境中运行良好,但是当我想在我的 AWS 实例上部署时,它总是失败,但我不知道为什么。我了解到,当我想在远程服务器上部署服务时,迁移应该对远程服务器可见是很重要的。
【解决方案2】:

替换这个:

country = models.ForeignKey(country, null=True, blank=True)

与:

country = models.ForeignKey(Country, null=True, blank=True)

我相信应该这样做。

【讨论】:

  • 对不起,我把所有的都改成小写试图解决这个问题。我所有的模型都是小写的。在所有模型都是大写之前。
【解决方案3】:
  1. 评论国家模型并运行

python manage.py makemigrations app_name

  1. 取消注释 country 模型并运行相同的上述命令(Country 模型将正确重新创建)

  2. 最后使用 migrate 将更改应用到 db:

python manage.py migrate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2011-09-28
    • 2020-05-03
    相关资源
    最近更新 更多