Django & South: Adding new field but DatabaseError occurs "table already exists" - python

In trying to add a new field to a preexisting Model/table, I get a DatabaseError with 'table already exists.' I have run migrations before this one so I am a bit puzzled why adding a new field would pop up this error.
Commands executed:
python manage.py schemamigration app --auto
python manage.py migrate app
Previous SO questions like this were answered with faking a migration.
python manage.py migrate app --fake
python manage.py migrate app
The problem that arises from this is that the column is not created. So when you runserver, you will see a DatabaseError 'no such column'.
As far as my model, I am only adding a CharField.
Thanks in advance for your help-

You need to do schemamigration app --initial first without your new field, then migrate app --fake 0001 (or whichever migration number it returned) to set the south database to that state (tables already created).
Add your new field, then run schemamigration myapp --auto, then migrate.

I commented out the field, ran schemamigration, then migrate. Uncommented out the field, ran schemamigration, then migrate and it worked. Not sure what I was doing wrong.

This happens when you doing something on migration and did not let south knows about it.
If you looking at the south_* table in the database, you will find-out south keeps logs about db migrations in the database. The common way is to faking the migration.
There is a fake argument for the South.
here you can find out what is all about:
http://south.readthedocs.org/en/latest/commands.html#options

Related

django doesnt run a specific migration (it skipped) in production

when I ran the makemigrations it returns
users/migrations/0002_remove_profile_image.py
- Remove field image from profile
But when i ran migrate users 0002.. it said CommandError: Cannot find a migration matching '0002_remove_profile_image.py' from app 'users'
when i ran migrate it said
No migrations to apply.
Your models in app(s): 'users' have changes that are not yet reflected in a migration, and so won't be applied.
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
what can i do?
i am deploying on heroku
It seems you are using the migration name with the .py:
./manage.py migrate users 0002_remove_profile_image.py
But the correct usage is without it, so just remove that:
./manage.py migrate users 0002_remove_profile_image
or just the short-hand:
./manage.py migrate users 0002
Sorry, my bad. I was running with heroku run I should have run locally first.

How to recreate a deleted table with Django Migrations?

There are two models Groups and Students and only one table for Groups of them, the Students table was deleted.
How to make Django recreate the deleted table? If I do makemigrations it prints "No changes detected".
On admin page when I click on the Students table it throws an exception:
relation "students_students" does not exist
In django 1.7 you can try:
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
If you are working in django 1.9.5 this is the 100 % solution for this problem:
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!
Jan 2021
I had a migration problem and I had to drop/delete a table by pgadmin. Then, when I makemigrations and migrate the table wasn't recreated. In this way, I've found this procedure which worked for me:
python manage.py migrate --fake app_name zero
python manage.py migrate app_name
[NOTE]
If you don't have the intended migration file, create that before the above commands by python manage.py makemigrations
If you don't want to roll back to the initial(zero) state use the number of migration file instead of zero, e.g. python manage.py migrate --fake myappname 0005
I tested this approach in Django 2.2
Read More
There isn't an easy way to get Django to recreate a table that you have deleted manually. Once your database is altered manually, Django's view of the database (from migrations) is different from reality, and it can be tricky to fix.
If you run the sqlmigrate command, it will show you the required SQL to create the table. You can run the sql in a database shell. Assuming your app name is students, and the migration that created the table was 00XX_create_students.py, you would do:
./manage.py sqlmigrate students 00XX_create_students
Be careful if there are foreign keys to or from the students table, the constraints will have to be created as well.
The only way that worked for me:
rm -r <app-name>/migrations/
python manage.py makemigrations <app-name>
python manage.py sqlmigrate <app-name> 0001_initial
Copy what it prints out (or, depending on what you have actually removed from the DB, only part of the SQL queries).
Apply those copied queries to your DB:
psql -U user_name -h 127.0.0.1 database_name
Paste what you have copied from the SQL queries printout.
Commit the queries.
And that's it - your missing tables are created.
The answer that worked for me is as follows:
Assume in your database a table of a model has been deleted and you need to re-create, then do the following.
comment out the model in models.py that creates the table that has been deleted (either the model class or a line that creates a table like a = models.ManyToManyField(...))
run: python manage.py makemigrations <app-name>, where <app-name> is the name of of the app where you have models.py
run: python manage.py migrate --fake <app-name>
un-comment the model in models.py
run: python manage.py makemigrations <app-name>
run: python manage.py migrate <app-name> (without the --fake)
and you the table should be back in the database. But any data that was in the table will be lost.
Delete the migration folder from your migration app folder and simply run the migration commands:
python3 manage.py makemigrations appname
python3 manage.py migrate
I just deleted my migrations folder, dropped the whole database, then i made migration for the app
python3 manage.py makemigration
python3 manage.py migrate
and it came back.
Rename the deleted table name to some_new_name in the models.py and run:
python3 manage.py makemigration
python3 manage.py migrate
again rename the some_new_name table to the original name and run
python3 manage.py makemigration
python3 manage.py migrate
finally, go to the dbshell and drop the table some_new_name
I create table manualy and it helps.
For Django 1.10.4
I deleted the db.sqlite3 file from the project folder and then ran the following commands:
python manage.py makemigrations app_name
python manage.py migrate
Django 1.11.2 using MariaDB, accidental drop of database table.
To recreate table, try the following:
1/ Delete all except for init.py in your app/migrations directory
2/ select * from django_migrations; delete from django_migrations where app = 'yourapp';
3/ Check your model is good and run: python manage.py makemigrations
4/ python manage.py migrate
Works for me!
if you have created your classes and performed the migration operation, and then you want to add items to your classes, empty the migration folder with this command beforehand.
In Django 3, I proceeded according to the following steps and it worked 100%
python manage.py makemigrations appname --empty
python manage.py makemigrations appname
python manage.py migrate
Actually, the above methods did not work for me, so I just perform the below workaround as I did not want to manually write the whole query to create the table.
So I changed the database in the settings file and re-ran the migrations command after deleting the migrations folder, then just performed the python migrate command it created new tables in another database then from there just opened the table in query view, copied the script, and inserted the table in my main database.
Another Simple way to do this is
Go to your migrations folder.
Search for the file which contains the code to create the Students table in DB.
Remove the code snippet from the file and save it.
Then run py manage.py makemigrations and py manage.py migrate again
This worked for me :)
In this case, you need to trick django!
Do one thing...
copy the "students" model in models.py with other name like
"studentscopy".
Now run --> python manage.py makemigration
It will create a new migration in migration package of your app. Open
that last migration and rename "studentscopy" back to "students"
in that file.
Now run --> python manage.py migrate
It will create the table again with "students" name and at last delete that "studentscopy" model from your models.py file.
Below steps solved the problem for me
Delete all migrations files
python manage.py makemigrations (Create your initial migration file 0001_inital.py)
python manage.py migrate --fake <app_name> zero
( Tell Django to mark the migrations as having been applied or unapplied, but without actually running the SQL to change your database schema. This brings the migrations to zeroth state. Otherwise Django will think there's no change to apply )
python manage.py migrate

Django : Table doesn't exist

I dropped some table related to an app. and again tried the syncdb command
python manage.py syncdb
It shows error like
django.db.utils.ProgrammingError: (1146, "Table 'someapp.feed' doesn't exist")
models.py
class feed(models.Model):
user = models.ForeignKey(User,null=True,blank=True)
feed_text = models.CharField(max_length=2000)
date = models.CharField(max_length=30)
upvote = models.IntegerField(default=0)
downvote = models.IntegerField(default=0)
def __str__(self):
return feed.content
What I can do to get the tables for that app ?
drop tables (you already did),
comment-out the model in model.py,
and ..
if django version >= 1.7:
python manage.py makemigrations
python manage.py migrate --fake
else
python manage.py schemamigration someapp --auto
python manage.py migrate someapp --fake
comment-in your model in models.py
go to step 3. BUT this time without --fake
For those that may still be having trouble (like me), try this out:
Comment out all the URL's in the main app's urls.py
Then go ahead and run migrations:
$ ./manage.py makemigrations
$ ./manage.py migrate
The problem was alleviated by removing the ()'s
solved_time = models.DateTimeField('solved time', default=timezone.now())
to
solved_time = models.DateTimeField('solved time', default=timezone.now)
I got this answer from reddit
What solved my problem in situation when manage.py setmigration and then migrate to the SQL database is not working properly did is following:
Run command : python manage.py migrate --fake MyApp zero
After that: python manage.py migrate MyApp
And the problem that rises with connections.py and and after running correctly the migration command is solved! At least for me.
I'm using Python (3.x), MySQL DB, Django (3.x), and I was in situation when I needed after some time of successfully creating tables in my database, that some error regarding connections.py raises. But, above commands helped. I hope they will help all those who are having these type of problems.
I just ran migrations with the name of the app attached, for all the apps I had provisioned and that worked.
e.g. python3 manage.py makemigrations my_custom_app
After running for all of them I ran a migrate command to seal the deal.
python3 manage.py migrate. That was it. I'm still wondering why django behaves this way sometimes though.
none of the above solutions worked for me, I finally solved by
sudo systemctl stop mysql.service
sudo apt-get purge mysql-server
sudo apt-get install mysql-server
sudo systemctl stop mysql.service
In my case the code that I pulled had managed = False and I wanted the tables to be maintained by Django.
But when I did makemigrations the custom tables were not being detected or I was getting the error that the app_name.Table_name does not exist
I tried the following:
delete all the migration files inside the migrations folder (except init.py file) and then makemigrations then finally migrate
above 2 answers
this
PS: This solution is only feasible if backup is present or data is not important or you are just started creating the tables, as purging mysql will lead to loss of data
This is linked to the migration data in the scripts inside the project not matching with the migration scripts in the database as far as I could tell.
I solved this by the following steps :
Delete all the migration scripts under migration folder except __ini__
Make sure that the model.py contains the same structure as the table in the database and managed=True
Remove all Django Created tables like auth_user,... etc
Run the following code
$ ./manage.py makemigrations
$ ./manage.py migrate
This will create the migration scripts again and will apply it to your database.
I had this issue where I was playing with same database structure in production vs development. While dropping and recreating tables will probably resolve the issue, its worth checking your database itself and see if the model is actually correct. For myself I created the development database incorrectly with the table names all in lowercase while in production the first letter of tables were capitalized. I used the python manage.py inspectdb command on production db, and compared it to the model and realized that in the model it was trying to insert data to table 'test' instead of 'Test' for example. Hope that helps some of you in future.
I had a similar issue.
I had another python (with a class) file which need access to DB.
For some reasons, when running 'makemigrations' this file was processed (I guess this is linked to some import chains).
In this class, I had a method containing a default arg method(defaultModel=Model.get_default()) in the signature which was accessing to the default object in the DB (static method included in the Model class).
A the import time, this default arg was evaluated and as the table is not populated yet, it gives this error.
So I just set None for the default args and asks for the default model object inside the method. This solved the issue.
I have to face same issue and there are a couple of approaches, but the one I think is the most probable one.
Maybe you are loading views or queries to database but you havenĀ“t granted enough time for Django to migrate the models to DB. That's why the "table doesn't exist".
Make sure you use this sort of initialization in you view's code:
Class RegisterForm(forms.Form):
def __init__(self, *args, **kwargs):
super(RegisterForm, self).__init__(*args, **kwargs)
A second approach is you clean previous migrations, delete the database and start over the migration process.
I tried all of the above tricks and never worked for me.
I commented on all imports and URLs that called a particular Table
In this solution, your data will be removed. I removed the app and created the app again. I copied the app folder somewhere and delete the app folder from my project. I commented on all lines in urls.py and files similar views.py and admin.py that use this app. also app name in settings.py.
In mysql:
truncate django_migrations;
truncate django_admin_log;
Do this for all models in your app and change n.
n is app id.
delete from auth_permission where content_type_id=n
delete from django_content_type where app_label='appname'
python manage.py startapp your_app_name
Then uncomment previous lines and restore files and run
python manage.py makemigrations
python manage.pt migrate
I faced the same problem, some of the above mentioned answers seemed not to work for me, but here's a simple 4 step solution:
1) Delete the migrations files below __init__.py (don't delete __init__.py) in your specific app.
2) python manage.py makemigrations AppName
3) python manage.py migrate --fake AppName zero
4) python manage.py migrate AppName
Hope these works for you.
I faced the same issue earlier when I accidentally deleted my migrations folder in an app. I was able to fix it by running manual makemigrations for that specific app.
Here's the fix for Windows,
py manage.py makemigrations <your_app_name>
py manage.py migrate
For other OS you need to replace py with python3 or python
I hope this helped fix your issue!
if the python manage.py migrate still doesn't work I mean when you do this it nothing do anything you can delete the app's migrations from django_migrations table after then do
python manage.py migrate

Django South - Migration not re-creating model after dropping table from sqlite3

I am a newbie and a new user to Django and South. I created a new model (approval.py) in my models package (and linked it in model's init.py) and was able to successfully migrate my app to accept the new model. However, when I tried looking for that model on the admin site, I was getting a 403 forbidden error since the Guardian permissions were not applied.
So I directly dropped the table from sqlite command prompt and tried to perform the following commands again:
$python manage.py syncdb
...
(use ./manage.py migrate to migrate these)
$python manage.py schemamigration myapp --auto
Nothing seems to have changed.
$python manage.py migrate myapp
Running migrations for myapp:
- Nothing to migrate.
- Loading initial data for myapp.
Installed 0 object(s) from 0 fixture(s)
However, the table is no longer getting created, when I check in sqlite command prompt. Also, I had registered this model on my admin.sites.url, but it is no longer displaying it and giving error as:
DatabaseError at /admin/myapp/approval/
no such table: myapp_approval
Request Method: GET
Request URL: http://localhost/admin/approval/
Django Version: 1.5.1
Exception Type: DatabaseError
Exception Value:
no such table: myapp_approval
Exception Location: /home/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 362
Python Executable: /home/bin/python2.7
Python Version: 2.7.5
Python Path:
['.........']
Server time: Wed, 9 Jul 2014 19:12:00 -0500
I have already checked all the other questions posted on StackOverflow about using South for migrations, in particular the error about "Nothing seems to have changed". However I am not able to resolve my issue with any of those solutions.
I kindly request some help in either :
Creating the approval model again from scratch and migrating it successfully
Or Repairing the existing approval model.
Thanks.
Finally after a lot of trial and error, something very simple worked for me. I did not have much luck with the south migrations. So as I had manually dropped the table from sqlite3, I decided to manually create the table in sqlite3 and everything worked perfectly fine.
I used the below script on the sqlite3 prompt and it solved my issue and I was able to access the approval page correctly through my admin site and perform all CRUD operations on it.
CREATE TABLE "myapp_approval" ("id" integer NOT NULL PRIMARY KEY, "desc" varchar(256) NOT NULL);
Thanks everyone for your help and support!
You have already created a migration that creates the new table, and according to South's history management, you've run this migration. South does not know about the actual changes to your database.
What you need to do is to revert to a migration before the new table was created. If you look in your apps folder, you'll find a migrations folder with some migration files in it. If you created the new table in e.g. migration 0005, you need to (optionally) migrate backwards to 0005, and then you need to fake a backwards migration to 0004 and migrate again:
manage.py migrate myapp 0005
manage.py migrate myapp 0004 --fake
manage.py migrate myapp

Issues with creating table via migration

I have created a model and when I try to create the table via migration using python manage.py migrate app_name and in response I get
- Nothing to migrate.
- Loading initial data for app_name.
Installed 3 object(s) from 1 fixture(s)
But the table is not created , its a simple process but I don't know why the table is not created. The db used is postgresql and I have also used syncdb but doesn't work .
It seems you haven't created any migrations. You need to create them, before they can be run.
For app's initial first migration you run:
./manage.py schemamigration your_app --initial
For following migrations you run (provided you want to create an automatic migration):
./manage.py schemamigration your_app --auto
You can see more examples in the tutorial.

Categories