Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix a Database Error and ghost migration error in Django?

I am getting an DatabaseError saying no column named playlist exists and I'm trying to figure out how to fix it. I'm using South. I deleted the old files in the my migrations folder and ran:

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

I get this error when I do that:

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). 

I'm not sure how to get rid of this error, since in my migrations folder I only have init.py(c) and 0001_initial.py(c); I don't have 0002 migration file anymore.

When I try runserver and click "add playlist" in the admin, this is when I get the DatabaseError. If it helps, my models.py is:

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

Any advice on how to fix this?

like image 212
sharataka Avatar asked Dec 04 '22 01:12

sharataka


2 Answers

Just run

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

This should remove non existing migration from the database table south_migrationhistory.

like image 94
Aidas Bendoraitis Avatar answered Dec 25 '22 10:12

Aidas Bendoraitis


First, you should work out what happened to get the db and filesystem out of sync.

Then, if appropriate, you can do

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

or

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

as Aidas said, whichever seems more appropriate. The ignore option is probably less risky, although something has already gone astray for you to get to this state.

like image 40
Terry Brown Avatar answered Dec 25 '22 10:12

Terry Brown