Django:“;冲突的空/非空声明”;从sqlite3到Postgres

Django:“;冲突的空/非空声明”;从sqlite3到Postgres,django,sqlite,postgresql,django-south,Django,Sqlite,Postgresql,Django South,我一直在使用Django项目开发sqlite3数据库。我正在将项目转移到使用Postgres的生产环境中。我用过南方,所以我所有的迁移都是自动化的 尝试迁移架构时遇到以下错误: [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

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

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

[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所建议的,您不能同时拥有null主键,因此以下更改解决了此问题:

    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\u id
被设置为主键,现在它正试图将
id
添加为主键。有什么帮助吗?

据我所知,主键不能为空。那太糟糕了


我建议删除迁移中显示Null=True的部分,然后再试一次。

我对Python一无所知,但在标准SQL中主键列不能为Null。Alvaro是正确的,delete也是unique=True,因为您已经在使用OneToOneField,这在DjangoThangor中是可以理解的,这解决了问题。你能帮我看一下我的编辑,看看我面临的另一个问题吗?谢谢。这些桌子好像已经存在了?您的迁移与现实不同步。您需要从DB表中删除该列,或者从迁移中删除该行。或者,如果还没有,您可以将该行分离到它自己的迁移中,然后更新south_migrationhistory以表明它已被应用。