我正在使用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]$
如你所见,南方认为无所事事。但是,最后三个模型是全新的,并且在数据库中没有表。
有什么我可以做的,没有切换数据库让南方再次工作?
我无意为项目的其余部分手动编写迁移,但如果它有用,我会编写一个迁移。
答案 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。如果为时已晚,并且您不关心数据库中的数据运行:
python manage.py flush
sudo rm /path/to/myapp/migrations/*.*
python manage.py syncdb
sudo python manage.py convert_to_south myapp