南方不会为现有应用生成或应用迁移,并且需要进行迁移更改

时间:2011-09-04 15:41:46

标签: python django migration django-south

我正在使用South来生成和应用迁移,而不是自己管理迁移。不幸的是,南方拒绝实际任何事情。成绩单如下:

[graffias:~/testing.tustincommercial.com/oneclickcos]$ python ./manage.py schemamigration mainapp --auto
You cannot use --auto on an app with no migrations. Try --initial.
[graffias:~/testing.tustincommercial.com/oneclickcos]$ python ./manage.py schemamigration mainapp --initial
 + Added model mainapp.CompanyUK
 + Added model mainapp.CompanyName
 + Added model mainapp.Individual
 + Added model mainapp.Director
 + Added model mainapp.DirectorsIndividual
 + Added model mainapp.DirectorsCorporate
 + Added model mainapp.ShareCapitalClass
 + Added model mainapp.Member
 + Added model mainapp.MembersIndividual
 + Added model mainapp.MemberGeneric
 + Added model mainapp.CompanyManager
 + Added model mainapp.PendingRegistration
 + Added model mainapp.PendingAuthorisation
Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate mainapp
[graffias:~/testing.tustincommercial.com/oneclickcos]$ python ./manage.py migrate mainapp
Running migrations for mainapp:
- Nothing to migrate.
 - Loading initial data for mainapp.
No fixtures found.
[graffias:~/testing.tustincommercial.com/oneclickcos]$ 

如你所见,南方认为无所事事。但是,最后三个模型是全新的,并且在数据库中没有表。

有什么我可以做的,没有切换数据库让南方再次工作?

我无意为项目的其余部分手动编写迁移,但如果它有用,我会编写一个迁移。

4 个答案:

答案 0 :(得分:9)

我猜你没有开始使用./manage.py convert_to_south mainapp而陷入困境。也许你可以通过这样做来纠正这个:

(1)让South相信你没有进行第一次迁移,所以转到零

./manage.py migrate --fake mainapp zero

(2)迁移到第一次迁移。

./manage.py migrate mainapp

但是对于我可以提出的问题,你已经在数据库中创建了一些没有南方的模型,否则你就不必使用--initial。如果是这样,它可能会抱怨已存在的列。

您可以通过以下方式更改此情况:

(1)通过删除mainapp / migrations / 0001_initial.py来消除第一个模式迁移。您不需要直接使用南数据库表,--delete-ghost-migrations将处理此问题。

(2)./manage.py syncdb South希望数据库与模型同步。

(3)./manage.py convert_to_south mainapp实际让South处理数据库和迁移。

(4)./manage.py migrate --delete-ghost-migrations mainapp转移到第一次迁移并删除从迁移/数据库中删除的旧的第一次迁移

答案 1 :(得分:2)

来自脏兮兮的部门:

这个过程解决了我的问题,但它并不优雅。

(1)删除受影响的应用中的所有迁移(rm mainapp/migrations/*

(2)删除models.py,并将其替换为空文件(mv mainapp/models.py .; rm mainapp/*.pyc; touch mainapp/models.py

(3)生成不执行任何操作的初始迁移(python ./manage.py schemamigration mainapp --initial),然后应用它(python ./manage.py migrate mainapp

(4)恢复一个模型,并生成一个将重新创建所有内容的迁移(rm mainapp/models.py; mv models.py mainapp/; python ./manage.py schemamigration mainapp --auto

(5)在运行新迁移之前,编辑它以注释掉所有不是新变化的变更。或者,运行它,让它在实际存在的表上失败,然后注释掉所有内容。

(6)应用您的迁移将南方置于正常状态(如果您按照步骤(5)中的推荐课程执行更改:python ./manage.py migrate mainapp

欢迎更好,更清晰的建议,以及这种方法可能会破坏的其他迹象。

答案 2 :(得分:2)

另请注意,如果您正在使用像Johnny Cache这样的QuerySet缓存,那么从数据库中删除迁移历史记录将无济于事,您需要杀死memcached:killall memcached,或者对于生产中的项目,您需要使south_migrationhistory表无效使用以下python manage.py shell

from johnny.cache import invalidate
invalidate('south_migrationhistory')

对我来说就是这样。

答案 3 :(得分:1)

如果您已经创建了数据库,那么您需要使用:

python manage.py convert_to_south myapp

而不是schemamigration。如果为时已晚,并且您不关心数据库中的数据运行:

  1. 清除数据库: python manage.py flush
  2. 使用以下内容删除旧迁移:sudo rm /path/to/myapp/migrations/*.*
  3. python manage.py syncdb
  4. sudo python manage.py convert_to_south myapp
相关问题