I have a django database with a custom user profile for the user model.
The problem is that when I want to add new fields to my userprofile class, I get the error no such column, regarding the new field, when trying to access the users table.
Any way then to update the userprofile model without having to rebuild the database?
Thank you.
Here is how to do it..
First install south
pip install south
Then add to your settings INSTALLED_APP list as -
...,
'south',
...
What is south?.. Well south is a django app that helps you updating your database without having to rebuild it. Now initialise your models with-
python manage.py syncdb // this will create the south tables for migrations
python manage.py schemamigration <appname> --initial // (once per app) this will create the initial model files in a migrations package
python manage.py migrate
Then every time you update your models just need to perform an update with -
python manage.py schemamigration <appname> --auto
python manage.py migrate <appname>
You can find the full documentation here - http://south.readthedocs.org/en/latest/tutorial/
Related
Recently I'm doing a small Django project that I have to work with my teammates,
so I clone the project's repository from github.
The problem is , the database in my computer doesn't have the table so i think i have to makemigrations and migrate it. But after i did that,django only createed its own tables but didn't create other tables that my teammates wrote in Django's models.
I really need your guys hlep
this are the models my teammates wrote
but after i makemigrations and migrate it ,phpmyadmin does not show the tables i want
makemigrations and migrate
the picture on phpmyadmin after I migrate django models
This is my settings
after tried this,it still not working
migrations folder
You should use managed=True in all models for managing the migrations via django
run
python manage.py makemigrations *name_of_you_app_that_has_models_here*
python manage.py migrate *name_of_you_app_that_has_models_here*
Take a look at this:
$ pypy ./manage.py syncdb
/usr/lib64/pypy-2.4.0/site-packages/django/core/management/commands/syncdb.py:24: RemovedInDjango19Warning: The syncdb command will be removed in Django 1.9
warnings.warn("The syncdb command will be removed in Django 1.9", RemovedInDjango19Warning)
(cut)
I ran a quick google search, but could not find the answer - what should I be using instead of syncdb?
syncdb is deprecated because of the migration system, introduced with django 1.7.
Now you can track your changes using makemigrations. This transforms your model changes into python code to make them deployable to another databases. When you have further modifications you need applied to the database, you can use data migrations.
After you created the migrations you have to apply them: migrate.
So instead of using syncdb you should use makemigrations and then migrate.
Workflow on development after you changed something in your models:
./manage.py makemigrations
./manage.py migrate
And on your production system:
./manage.py migrate
Bonus: you do not need to run migrate for each change. If you have multiple changes not applied yet django will run them in the correct order for you.
You should definitely use migration system. Which lets you track changes in your models.py, and create migrations for the database. The migration system uses the commands makemigrations to create migrations and migrate to migrate the database.
If for whatever reason you need to create a database the same way syncdb did it there is command flag that causes migrate to work the same way. You should only do this if you REALLY need it and you know what you are doing. For example to create an empty database on for a continuous integration system of your choice.
python manage.py migrate auth
# performs migrations for auth and contenttypes contrib apps
python manage.py migrate --run-syncdb
# creates the rest of the database
Tested on Django 1.9.1.
You should use the makemigrations and migrate commands that were introduced in django 1.7
https://docs.djangoproject.com/en/1.7/topics/migrations/
syncdb has some problem with db migration. so, after django 1.7 makemigrations and migrate have been introduced.
Now in django 1.9 syncdb has been deprecated.
try
1. python manage.py makemigrations which detects changes in db and creates one .py file as inside migrations folder
2. python manage.py migrate will apply the migrations to the database
I'm in production and just ran syncdb but I made a mistake and want to delete what syncdb did, including all data in the tables is fine. Just a fresh start in the databases so I can run syncdb again.
(virtualenv-2.7)[root#server mysite]# python manage.py sqlclear mainapp | python manage.py dbshell
CommandError: One or more models did not validate:
app.comment: 'poster' defines a relation with the model 'auth.User', which has been swapped out. Update the relation to point at settings.AUTH_USER_MODEL.
app.myuser: The field named as the USERNAME_FIELD should not be included in REQUIRED_FIELDS on a swappable User model.
Recreate database is probably the best way. Also you can do it using reset_db management command from django-extensions package.
The Django 1.7 support migrate
you just run python manage.py migrate again after edit.
more features to see: release note
As J0HN stated in the comments, the best thing to do to start fresh was to actually just delete the database. I thought it might mess something up, but it won't. Simply login to mysql.
drop database whatever_your_database_name;
create databse whatever_your_database_name;
Then simply sync it again with python manage.py syncdb
Maybe its lazy, but I run:
django-admin.py reset_db --router=default --noinput
I upgrade to django 1.7
and need to deal with migration
My database already exists tables
Here is my step :
1.I delete the migration in django app test
2.I remove south(from INSTALLED APPS ) in django settings.py
3.run python manage.py makemigrations test
Migrations for 'test':
0001_initial.py:
- Create model Person
- Create model Book
- Create model Artical
run python manage.py migrate test
Operations to perform:
Apply all migrations: test
Running migrations:
Applying test.0001_initial... FAKED
is it right???
How to do migration if I already have tables?
Please guide me Thank you
it is right if the tables that exist in your database have the same structure as your current models (i.e. you haven't modified your models.py file after you applied you last migrations with South). If that's the case, you can proceed without worries.
If the structure is different, you can try different approaches:
Create the needed migrations manually. You will have to write your own migration with the needed modifications. Here you can find some example code of a migrations file for altering or adding fields and here you have the complete reference of the methods you can call
Modify your database manually with phpmyadmin, raw sql or the method you prefer.
Do a python manage.py dumpdata app1 app2 app3 > data.json, remove the db, create it again and to a python manage.py loaddata data.json. This may raise some errors because the data you saved was with the old structure, you will have to deal with each error.
Or the least preferred, if the data you had is not needed, just remove the db and recreate it.
There is nothing wrong with the way you are doing it.
The reason the first migration is faked is because your tables are already created:
Run python manage.py migrate. Django will see that the tables for the
initial migrations already exist and mark them as applied without
running them.
From the documentation on upgrading from South.
In Django, if I have a model which has 4 fields, but now I want to add a new field, how do I keep the data in the old model?
use South
pip install South
firstly, keep your django models match your current database tables exactly, then run:
python manage.py schemamigration myapp --initial
python manage.py migrate myapp --fake
#Make changes to your django model (add new field)
python manage.py schemamigration myapp --auto
python manage.py migrate myapp
You'll need to perform a "migration", and the current best way to do this in Django is with a tool called South.
Check out their tutorial. Make sure you make a copy of your db before you do this, since you may mess something up if it's your first time using South.