Django 1.7 migrations won't recreate a dropped table, why?

前端 未结 10 1037
挽巷
挽巷 2020-12-23 14:16

Using Django 1.7 migrations.

I accidentally dropped a table in my database. I assumed that by running migration again this would recreate the table but no, Django st

相关标签:
10条回答
  • 2020-12-23 14:44

    Go to your database and find the table django_migrations. Delete all the rows which have app equals your app name.

    Then do a makemigrations & migrate will work.

    0 讨论(0)
  • 2020-12-23 14:51

    Another solution I've found and works perfectly:

    In django 1.7:

    1. Delete your migrations folder

    2. In the database: DELETE FROM django_migrations WHERE app = 'app_name'.

      You could alternatively just truncate this table.

    3. python manage.py makemigrations

    4. python manage.py migrate --fake

    In django 1.9.5:

    1. Delete your migrations folder

    2. In the database: DELETE FROM django_migrations WHERE app = 'app_name'.

      You could alternatively just truncate this table.

    3. python manage.py makemigrations app_name

    4. python manage.py migrate

    This works 100% for me!

    0 讨论(0)
  • 2020-12-23 14:52

    Migrations check for differences in your models, then translates that to actions, which are translated to SQL. It does not automatically sync the db scheme with your models, and it has no way of knowing you dropped a table (it doesn't know about manual changes because, well, you're not supposed to do manual changes. That's the point)

    The answer? a manual change requires a manual migration as well. What you need to do is simply write your own migration and manually tell south to re-build the table. It's not very difficult, The docs make it pretty easy. Just make something like this:

    from django.db import migrations, models
    
    class Migration(migrations.Migration):
    
        operations = [
            migrations.CreateModel("Foo"),
            migrations.AddField("Foo", "bar", models.IntegerField(default=0))
        ] 
    

    You can probably look into the first migration file (the one that made the model in the first place) and copy paste almost all of it. Then all you have to do is run the migration like you always do

    0 讨论(0)
  • 2020-12-23 14:54

    In my case in django 2.0.2 for recreating dropped table I needed to comment my models in myapp and then migrate with --fake and uncomment my models and migrate without --fake A little different from raul answer:

    1. Delete your migrations files in your desired app
    2. Thanks to raul answer: In the database: DELETE FROM django_migrations WHERE app = 'app_name'.
    3. comment codes in models.py and all this models usage in views, signals and etc (to prevent error).
    4. python manage.py makemigrations YOUR_APP_NAME
    5. python manage.py migrate --fake
    6. un-comment what you commented in step 3
    7. python manage.py makemigrations YOUR_APP_NAME
    8. migrate without --fake: python manage.py migrate

    This should solve some users problem.

    0 讨论(0)
提交回复
热议问题