私は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)
編集
ジョーダンが提案したように、両方の主キーを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_id
その理由は、以前の移行では主キーに設定されていたが、現在は主キーとして追加しようとしているためだと思いid
ます。これで何か助けはありますか?