问题
(I know there is a title the same as this, but the question is different).
I have managed to get my development machine migrations and production migrations out of sync.
I have a Django app which was using South. I had my own workflow that worked fine (it probably wasn't the correct way to do things, but I had no problems with it).
Basically I have a script that copies the production database dump to my development machine. It also copied the migration files. That way the two were in synch, and I could run South commands as normal.
Now I have upgraded to 1.7, and started using migrations. When I use my previous workflow (copy database dump, and migration files from production), it is not detecting changes on my development machine.
I have read through the migrations document, and I see that the correct way to use it is to
- run "make migrations" and "migrate" on my development machine.
- run "migrate" on my devlopemnt machine to actually make the database changes
- Copy changes over, including migration files.
- run "migrate" on the production machine. (without the "makemigrations" step)
Anyway. It is all a mess now. I would like to "reset" my migrations and start from scratch, doing things properly from now on.
What do I need to do?
- Delete the contents of the migration table (on both machines)?
- Delete the contents of the migration folder? (Including the init.py file).
- Start the migrations as per the documentation for a new one.
Have I missed anything? Is there a reason why copying everything from production(database and migration files) doesn't detect any changes on my development machine afterwards
回答1:
I would just do the following on both the environments (as long as the code is the same)
- Delete your migrations folder
- DELETE FROM django_migrations WHERE app =
<your app name>
. You could alternatively just truncate this table. python manage.py makemigrations
python manage.py migrate --fake
After this all your changes should get detected across environments.
回答2:
Run
python manage.py migrate your_app zero
This will drop all tables from your_app
If you want, since you said you want to start over, you can delete your migrations folder, or maybe rename the folder, create a new migrations folder and run
python manage.py makemigrations your_app
python manage.py migrate your_app
Just like south, you can always go back and forth...
# Go to the first migration
python manage.py migrate your_app 0001
# Go to the third migration
python manage.py migrate your_app 0003
So imagine that your 4th migration is a mess... you can always migrate to the 3rd, remove the 4th migration file and do it again.
Note:
This one of the reasons your models should be in different apps. Say you have 2 models : User and Note. It's a good practice to create 2 apps: users and notes so the migrations are independent from each other.
Try not use a single application for all your models
回答3:
A minor variation on harshil's answer:
$ manage.py migrate --fake <appname> zero
$ rm -rf migrations
$ manage.py makemigrations <appname>
$ manage.py migrate --fake <appname>
This will ...
- pretend to rollback all of your migrations without touching the actual tables in the app
- remove your existing migration scripts for the app
- create a new initial migration for the app
- fake a migration to the initial migration for the app
回答4:
1)
Start by droping your database using SQL language if you are using a database system like Posgres or MySQL and you have a database with name mydb
delete mydb;
2)
Next you need to go through all migrations folders for each app that belongs to your project and delete the migrations files except for init.py
If you are using a terminal under Linux/MAC you can automate this tedious easilly .For example
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
3)
Next and last all you have to do is execute the two migrations command you normally invoke when you are syncing your models to a new database with Django
python manage.py makemigrations
python manage.py migrate
Make sure you have created a new database after deleting the old one if you are using any database system other than sqlite.
When your app is on production because you can't drop your database so how can you reset migrations in this case ?
We simply need to keep the database while getting rid of migrations history .Here is how you can do it in detailed steps :
1)
First go through each app and detete its migrations history by issuing the following command
python manage.py migrate --fake myApp zero
Django will unapply any previous migrations for the specific app(myApp)
2)
Next you need to actually delete the migrations file so you'll need again to go through each app migrations folder and delete them except for init.py .Simply use the folloing script under any unix based operating system.For Windows you can use the power commandd line .It should be similar to unix but sincerly i don't use Windows and netier power bash
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
You can easily verify your migrations using :
python manage.py showmigrations
3)
Next we need create the migrations again so just execute
python manage.py makemigrations
BUT don't forget the database still have tables belonging to initial migrations so what we need to do is migrating our database and in the same time faking the initial migartions you can do that by simply execute
python manage.py migrate --fake-initial
来源:https://stackoverflow.com/questions/29253399/how-to-reset-migrations-in-django-1-7