How can reset django apps which migration folder was deleletd? - django

In my django app path, the migrations folder was deleted, but I want to recover it, when executing migrate command:
python manage.py migrate --fake api.desktops
CommandError: App 'api.desktops' does not have migrations (you cannot selectively sync unmigrated apps)
How can reset those app?

If your database and and app are synchronised you should be able to do the following:
./manage makemigrations <app_name>
./manage migrate <app_name> --fake
If the database is out of sync you can also perform the same as above but will need to manually alter your database to align with the new migration structure.

Related

Is it possible to make migrations from db not from model?

Suppose, we have a db's backup and a django program. The program do not have any migrations. First we restore db, that has created table and data. Now we want to make migrations from available db. Is it possible or not?
Yes, Django has the inspectdb method, which is described here.
But if the Django app already has the models defined that correspond to the backed up database, then you can just run makemigrations (follow #Shafikur's instructions).
Just go to your corresponding database terminals and delete all the records from you django_migrations table with
delete from django_migrations;
Go to terminal and run remove all files in migrations folder with
rm -rf <app>/migrations/
Reset all the migrations of the Django's built-in apps like admin with the command
python manage.py migrate --fake
Create initial migrations for each and every app:
python manage.py makemigrations <app>
To create initial fake migrations just run
python manage.py migrate --fake-initial

How to fix migrations for an app with existing schema while not touching other apps?

Django 1.9.7, db.sqlite3 as DB
I have a Django project with several apps. For app "A", I had migrations, but I deleted them by accident and pushed to the remote git. Also, a lot of new stuff for other apps was pushed to the git during the day. Other apps don't depend on the "A" app models.
Everything worked until I decided to add a new field to the model of the "A" app. I got OperationalError: no such column: error. I tried to make initial migrations for the app "A" python manage.py migrate --fake-initial. I got new migrations but I still have the OperationalError: no such column:.
How to fix "A" app migrations without affecting other apps migrations?
From git point of view, you can do revert to previous commit.
git revert sha #commit sha of the last commit
OR
git reset --hard HEAD~n #n how many commits to remove.
git push --force
Fixing through django(possible if you didn't add any migrations later.),
python manage.py makemigrations APP_A --empty
python manage.py makemigrations APP_A
python manage.py migrate --fake
Unfortunately git revert didn't help me. In the end, I solved the problem by executing the following steps:
1.Manually delete all tables related to the "A" app in db.sqlite3.
2.Create new migrations and db.sqlite3 tables from existing schema:
python manage.py makemigrations A --empty
python manage.py makemigrations A
python manage.py migrate
3.Dump the tables data back into db.sqlite3 from a backup:
sqlite3 ~/Backup/A/db.sqlite3 ".dump table_name" | grep -v "CREATE" | sqlite3 db.sqlite3

Cannot get Django 1.7 Migrations to detect proper changes to my DB.

I have a production web project running with a decent amount of data in the MySQL db. I am trying to update the database with some changes to an app called "enterlink." I've made new elements in the existing models and created new models altogether. Before this migration, I have never touched the schema of the db since originally running syncdb to create it. When I run: "python manage.py makemigrations enterlink" the below output appears(pic). My question is, why is this happening? The DB already includes all the models that it lists in the picture so why is it registering those lists of models? When I go to finish the migration by doing "python manage.py migrate" or "python manage.py migrate --fake enterlink" (pic again), I get an output shown but my database schema remains identical to the old db and any new code generates errors. Can anyone tell me what is likely the problem? I would be really appreciative of any advice. It's been very frustrating since I'm not sure what I'm missing.
What you have done is that you have ran the command python manage.py syncdb before running python manage.py makemigrations myapp and python manage.py migrate myapp. That is why syncdb created the database schema and the migration was faked because schema already exists. I will suggest to use python manage.py makemigrations myapp and python manage.py migrate myapp and not to use syncdb as its deprecated in Django 1.7.
If you change anything in your model, just run makemigrations and migrate command. Syncdb isn't necessary.
This question and relevant answers are intriguing me. Thus I want to share my experience on maintaining live database and migrations.
Tested in django1.5.5
Initializing the database:
./manage.py syncdb --noinput
./manage.py migrate
./manage.py syncdb
Now I have created the database.
Doing a migration for an app:
./manage.py schemamigration myapp --initial
./manage.py migrate myapp --fake
Now do necessary changes in your model
./manage.py schemamigration myapp --auto
./manage.py migrate myapp
Im newbie for schemamigration too, but i will explain how it works for me:
First you create app and then
./manage.py sycndb, so tables are created then you can
./manage.py makemigrations myapp --initial
so now initial migrations are created and you should apply them
./manage.py migrate myapp
now you can change your models : add,change fields, anything you want and then
./manage.py makemigrations myapp --auto
this will create migrations for changes and now you need to apply them
enter code here./manage.py migrate myapp
so this actually will create new tables in db

How to recover South from flushing db

I bulk loaded some data into my Postgresql db, only to realize all of it was a bit wrong. Keen to rectify this I flushed the db in order to reload the correct data.
Data reloaded, I made a change to a model and applied the normal ./manage.py schemamigration app --auto, and then ./manage.py migrate app (which had been working up to this point).
At this point I started getting the error:
django.db.utils.DatabaseError: relation "app_model" already exists
And the traceback appeared to be calling the initial migration file 001. So I think the answer is to do something like:
./manage.py migrate app 0005 --fake
Where the current migration that I'm looking to apply is 0006 (i.e. this is where the migrations began failing), and then the south database within postgres should be back where it was before I foolishly flushed it. At this point I should be able to
./manage.py migrate app
Can someone tell me that this approach is correct? Or if not, what the correct approach is?
After python manage.py migrate app --fake
do a python manage.py schemamigration app --auto
and then do a python manage.py migrate app
You can also make it more general:
python manage.py migrate
python manage.py flush
python manage.py migrate --fake
This will recover all the south history after flush

How to do a syncdb with django, when migrations are also involved

when I do a syncdb I get the following error everytime:
Not synced (use migrations):
- deals
- analytics
(use ./manage.py migrate to migrate these)
And when I run sudo python manage.py migrate. I get the following
Running migrations for deals:
- Nothing to migrate.
- Loading initial data for deals.
No fixtures found.
Running migrations for analytics:
- Nothing to migrate.
- Loading initial data for analytics.
No fixtures found.
I highly appreciate your help
From the output, it seems like the database is already synchronized with the migrations. There are no problematic errors. (Although you shouldn't really be root to run the migrations.)
If you're looking into creating more migrations, use the south documentation, which usually is just running the following after you modify the models:
python manage.py schemamigration --auto <APP>
And then use python manage.py migrate to apply the changes.
It looks like migrations have been already passed. Check south_migationhistory table in db.
If you want to sync new db for apps which has migrations just disable south in settings.py.
Have you ran a schemamigration initial yet?
./manage.py schemamigration deals --initial
./manage.py migrate deals
if you get the error, db already excists do this:
./manage.py schemamigration deals --initial
./manage.py migrate deals --fake