开发者

Pesky "Table 'my_table' already exists" in Django-South

开发者 https://www.devze.com 2023-02-16 13:44 出处:网络
In Django-South: I changed I\'ve run the initial migration successfully for myapp but for some reason, after I\'ve made a change to my model and go to

In Django-South: I changed I've run the initial migration successfully for myapp but for some reason, after I've made a change to my model and go to

./manage.py schemamigration myapp --auto
./manage.py migrate myapp

And I get a lot of traceback which ends in:

(1050, "Table 'my_table' already exists")
开发者_Go百科

After much googling, I found and tried this:

./manage.py migrate myapp --fake

And then I proceed to migrate it, to no avail; same error.

Any suggestions?


I just got this same error, and found this question by search.

My problem was that my second migration I'd created using the --initial flag, i.e.

$ ./manage.py startapp foo
$ ./manage.py schemamigration --initial foo
$ ./manage.py migrate foo

... make some changes to foo ...

$ ./manage.py schemamigration --initial foo

(oops!)

$ ./manage.py migrate foo

... and I get the error, and the migration fails because in the second migration, South is trying to create a table its already created.

Solution

In my migrations folder:

$ ls foo/migrations
0001_initial.py   0002_initial.py

remove that second migration and re-export the second migration with the correct --auto flag:

$ rm foo/migrations/0002_initial.py
$ ./manage.py schemamigration --auto foo
$ ./manage.py migrate foo

Success!

There may be other things that cause this error, but that was my bad!


Is it an existing app?

In that case you will need to convert it in addition to the fake bit.

There are good docs here on converting an existing app.

Although they are quite tricky to find if you don't know where they are already ( ;

For converting, after adding south to your installed apps:

./manage.py syncdb
./manage.py convert_to_south myapp
./manage.py migrate myapp 0001 --fake


this problem actually happens if one of the cases:

1) You made "schemamigration app_name --initial" after one is "--auto" 2) You interrupted the last migration you have made.

To resolve such problem you apply the following:

1) mark your last schema migration as fake.

python manage.py schemamigration app_name --fake

Note: Make sure that the schema of models is same as schema of tables in database.

2) apply the migration again by doing

python manage.py schemamigration app_Name --auto
python manage.py migrate app-Name

Note: sometimes you might add manually a specific field you already added using the following syntax.

python manage.py schemamigration app_name --add-field My_model.added_field

For more info. regarding south, you could check its documentation here.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号