Django:从sqlite3到Postgres的“冲突的NULL / NOT NULL声明”

时间:2013-02-05 15:49:28

标签: django sqlite postgresql django-south

我一直在使用Django项目处理sqlite3数据库。我正在将项目转移到我使用Postgres的生产环境中。我使用过South,所以我的所有迁移都是自动化的。

尝试迁移架构时遇到以下错误:

[05/Feb/2013 16:38:31] DEBUG [south:270] execute "ALTER TABLE "frontend_userprofile" ADD COLUMN "id" serial NULL PRIMARY KEY;" with params "[]"
FATAL ERROR - The following SQL query failed: ALTER TABLE "frontend_userprofile" ADD COLUMN "id" serial NULL PRIMARY KEY;
The error was: conflicting NULL/NOT NULL declarations for column "id" of table "frontend_userprofile"

[..]

django.db.utils.DatabaseError: conflicting NULL/NOT NULL declarations for column "id" of table "frontend_userprofile"

这是迁移文件的相关部分:

def forwards(self, orm):
    # Adding field 'UserProfile.id'
    db.add_column('frontend_userprofile', 'id',
                  self.gf('django.db.models.fields.AutoField')(default=None, primary_key=True, null=True),
                  keep_default=False)


    # Changing field 'UserProfile.user'
    db.alter_column('frontend_userprofile', 'user_id', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True, null=True))

[..]

    'frontend.userprofile': {
        'Meta': {'object_name': 'UserProfile'},
        'company': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['frontend.Company']", 'null': 'True'}),
        'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
        'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'null': 'True'})
    }

模特:

class UserProfile(models.Model):
    user    = models.OneToOneField(User, null=True, unique=True)
    company = models.ForeignKey(Company, null=True, default=None)

修改

正如Jordan所建议的那样,你不能同时拥有一个空主键,因此以下更改可以解决这个问题:

    db.add_column('frontend_userprofile', 'id',
                  self.gf('django.db.models.fields.AutoField')(default=None, primary_key=True),
                  keep_default=False)


class UserProfile(models.Model):
    user    = models.OneToOneField(User, unique=True)
    company = models.ForeignKey(Company, null=True, default=None)

但是我仍然在完成迁移时遇到问题:

DEBUG [south:270] execute "ALTER TABLE "frontend_userprofile" ADD COLUMN "id" serial NOT NULL PRIMARY KEY;" with params "[]"
FATAL ERROR - The following SQL query failed: ALTER TABLE "frontend_userprofile" ADD COLUMN "id" serial NOT NULL PRIMARY KEY;
The error was: multiple primary keys for table "frontend_userprofile" are not allowed

django.db.utils.DatabaseError: multiple primary keys for table "frontend_userprofile" are not allowed

我认为原因是之前的迁移user_id已设置为主键,现在它正在尝试添加id作为主键。对此有何帮助?

1 个答案:

答案 0 :(得分:1)

据我所知,您不能拥有NULL主键。那会很糟糕。

我建议在迁移过程中删除Null = True的部分并重试。