Add database field - Adjust models for Django app



Frequently used standard built-in django tool. 


python makemigrations app_name

But we see that it can crash and use better than other commands to sync database with code faster

For example:

 Ignore for now, and let me handle existing rows with NULL myself..

python migrate cyclusemail

Error relation "django_content_type" already exist


comment the dependencies

vim cyclusemail/migrations/

dependencies = [

#('cyclusemail', '0003_cyclus_paused'),


python sqldiff cyclusemail

So if you've got some infinite frenzy of mistakes then?

Don't do the table creation

python squashmigrations cyclusemail 0001_initial

That didn't help.

Remove all files in migration folder and then try

python migrate cyclusemail

What is almost always works?

python sqldiff app_name  

Then you get output somthing like this:

ALTER TABLE "cyclusemail_cyclus"

        ADD COLUMN "client" varchar(256);

CREATE INDEX "cyclusemail_cyclus_client"

        ON "cyclusemail_cyclus" ("client");

CREATE INDEX "cyclusemail_cyclus_client_like"

        ON "cyclusemail_cyclus" ("client" varchar_pattern_ops);

ALTER TABLE "cyclusemail_cyclus"

        ALTER COLUMN "unsubscribe" SET NOT NULL;

ALTER TABLE "cyclusemail_cyclus"

        ALTER COLUMN "paused" SET NOT NULL;

If you need to create table / model

python sqlmigrate app_name 


Or in old version of django 1.5


python sql app_name  


And you will get plain sql statments.




-- Create model Cyclus


CREATE TABLE "cyclusemail_cyclus" ("id" serial NOT NULL PRIMARY KEY, "email" varchar(256) NOT NULL UNIQUE, "unsubscribe" varchar(256) NOT NULL, "sent" boolean NOT NULL, "paused" boolean NOT NULL, "created" timestamp with time zone NOT NULL, "status" varchar(256) NULL, "client" varchar(256) NULL, "has_redirect" boolean NOT NULL, "job_id" integer NOT NULL, "keyword_id" integer NOT NULL);




With this command you can connect to database via default client and setting from django config.


python dbshell 


copy and paste  differences.


 class Meta: unique_together

If you try to add a field with unique_together .

unique_together = (("email", "client"),)

Then no field has to be changed, but an index and that is a problem. What I see is that this constraint is not applied.

python sqldiff job

-- No differences

Important: Don't forget that to do apache reload or restart. Because old code will still do validations even if database is modified..

But you see that index is not working as it should.

Then you can switch to SQL depending on your database. Postgres for example

SELECT tablename, indexname, indexdef FROM pg_indexes;

Or filtered result

SELECT  * from pg_indexes where tablename like '%spontaneousmail_spontaneousmail%';


Then find the name a of index that you are not using and take place. You can remove them.


DROP INDEX index_name;