django入门进阶13异常之makemigrations

makemigrations是django中的常用操作,但是坑也比较多。

坑的主要原因,使用django的manage.py makemigrations,django会加载整个项目,而不仅仅是models.py。而这会引发一系列问题。

01,初次初始化时使用了未(来得及)创建的表

比如:缓存类型对象查询到表,报错,进而导致无法执行makemigrations(无法创建对象表)类似先有鸡先有蛋矛盾。

比如:

views.py
member_buffer=Member.objects.all()

本意是为了当做类似缓存使用(就这意思,代码对没对不重要),但是makemigrations之前是没有表Member的,

要创建表Member就好扫描到views.py,然后就会报错。陷入悖论之中

解决:先注释掉views.py中的这一类查询,然后makemigrations,最后再恢复回来

02,非守护线程维持进程导致无法正确退出

和第一个问题类似,不过藏的更深,表现为执行makemigration后,命令未正常结束,而是卡在那里。

views.py
class Handler():
    def __init__(self):
        xxxxx
        thread.Thread().start()
handler=Handler()

handler此时是个单例,所以Handler里面的__init__会被执行到。意味着如果__init__存在 thread.Thread().start()线程启动语句的话,那么也会被执行,创建出子线程。这会导致makemigrations结束后,无法自动退出,光标在最后一行输出后闪动(实际makemigrations以及成功完成),由于子线程有锁,会阻塞父进程的退出(父进程认为事情没干完,所以也阻塞在那里)。

这个问题迷惑性较强,一般第一反应都是models.py写的有问题。其实和models.py没关系。

本质原因是代码不规范导致的。__init__中是初始化部分,最好别包含线程启动等实际性执行操作。可以用start函数统一启动,这样也丰富编码规范。

03,django.db.utils.OperationalError: no such table.

python  manage.py  makemigrations  
python   manage.py  migrate  

数据库中有一个django_migrations数据表,找到你需要创建数据表的那个name,然后delete,再运行上面两个文件即可解决报错问题.

凡是makemigrations相关问题,有解决的套路

1,如果只修改了部分app则makemigrations和migrate都指定具体app,避免全部app的扫描和更新。降低失败概率。

2,如果修改的app生成表失败,或者和预想不一致,则删除django_migrations数据表中有问题app相关记录,重新makemigrations+migrate生成(数据会丢失,线上别这么干就行了)

参考:https://blog.csdn.net/guyunzh/article/details/79487495