如何修复Django中的数据库错误和重影迁移错误?

时间:2012-10-26 14:46:39

标签: python django model django-south

我收到一个DatabaseError,说没有名为播放列表的列存在,我正在试图弄清楚如何修复它。我正在使用南方。我删除了我的迁移文件夹中的旧文件并运行:

python manage.py schemamigration app_name --initial
python manage.py migrate reserve

当我这样做时,我收到此错误:

south.exceptions.GhostMigrations: 

 ! These migrations are in the database but not on disk:
    <reserve: 0002_initial>
 ! I'm not trusting myself; either fix this yourself by fiddling
 ! with the south_migrationhistory table, or pass --delete-ghost-migrations
 ! to South to have it delete ALL of these records (this may not be good). 

我不知道如何摆脱这个错误,因为在我的迁移文件夹中我只有init.py(c)和0001_initial.py(c);我没有0002迁移文件了。

当我尝试运行服务器并在管理员中点击“添加播放列表”时,这就是我收到DatabaseError的时候。如果有帮助,我的models.py是:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    def __unicode__(self):
        return self.user

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)         

class Playlist(models.Model):
    playlist = models.CharField('Playlist', max_length = 2000, null=True, blank=True)
    def __unicode__(self):
        return self.playlist

class Video(models.Model):
    video_url = models.URLField('Link to video', max_length = 200, null=True, blank=True)
    def __unicode__(self):
        return self.video_url

class UserPlaylist(models.Model):
    profile = models.ForeignKey(User)
    playlist = models.ForeignKey(Playlist)
    def __unicode__(self):
        return self.playlist

class Videoplaylist(models.Model):
    video = models.ForeignKey(Video)
    playlist = models.ForeignKey(UserPlaylist)
    def __unicode__(self):
        return self.playlist

有关如何解决这个问题的建议吗?

5 个答案:

答案 0 :(得分:11)

跑步

python manage.py migrate reserve --delete-ghost-migrations

这应该从数据库表south_migrationhistory中删除不存在的迁移。

答案 1 :(得分:3)

首先,您应该弄清楚发生了什么,以使db和文件系统不同步。

然后,如果合适,你可以

python manage.py migrate reserve --ignore-ghost-migrations

python manage.py migrate reserve --delete-ghost-migrations
正如Aidas所说,无论哪个看起来更合适。 ignore选项可能风险较小,尽管某些事情已经误入歧途,你可以进入这种状态。

答案 2 :(得分:1)

South也在一个名为“迁移”的表中将迁移信息存储在数据库中。 [我认为这是表名;从记忆中写下这个。]

您需要清除该表格。

注意

  • 一旦清除了该表,就必须从头开始重新开始迁移;从最初的迁移开始。
  • 在执行此操作之前,最好先制作数据库的副本。我假设您的代码已经受版本控制。

答案 3 :(得分:1)

通常会发生此错误,因为您创建了迁移文件并进行了迁移,然后从文件系统(磁盘)中删除了迁移文件

因此,由于不再存在的迁移导致数据库发生更改。 根据您是否选择删除迁移文件文件,您可以执行哪些操作;继续,并从数据库中删除更改。

启动python shell; $ python manage.py shell

>>from south.models import MigrationHistory
>>MigrationHistory.objects.filter(migration='0002_initial').delete()

那将从db中删除0002迁移。 您现在可以继续创建/重新创建所需的迁移。

古德勒克, KOMU。

答案 4 :(得分:0)

只需运行目录中存在manage.py文件的命令

  

./ manage.py migrate appname --delete-ghost-migrations