Django删除数据库和迁移文件后执行makemigrations报no such table错误
问题原因
你的报错根源不是遗漏配置,是代码写法不符合Django的加载逻辑:
从报错栈可以直接定位到问题代码:..\projectname\appname\external\hiveserver_api.py第10行的语句:USB_ETHERNET_ADAPTER_MAC_LIST = [A.mac for A in unmigrateablemodel.objects.all()]
你把ORM数据库查询语句写在了模块顶层,Django执行makemigrations/migrate这类管理命令时,会先加载全项目的模块(包括路由、视图、以及你引用的这个接口模块),此时迁移还没执行,数据库里对应表还没创建,查询直接触发报错。
你注释调用代码后迁移能正常执行,是因为导入流程不会触发这个查询,等迁移跑完表建好后,再取消注释查询自然能正常运行。
解决方案
不要把需要查询数据库的全局变量直接写在模块顶层,改成懒加载形式即可,两种常用改法:
- 包装为函数,需要取值的时候再调用
# 修改hiveserver_api.py对应代码 def get_usb_ethernet_mac_list(): return [A.mac for A in unmigrateablemodel.objects.all()] # 其他业务代码用到USB_ETHERNET_ADAPTER_MAC_LIST的位置,替换为调用get_usb_ethernet_mac_list()即可
- 用Django自带的懒加载缓存装饰器,第一次调用的时候才查库并缓存结果
from django.utils.functional import cached_property class APISERVICE: @cached_property def USB_ETHERNET_ADAPTER_MAC_LIST(self): return [A.mac for A in unmigrateablemodel.objects.all()] # 调用方式不变,直接用APISERVICE.USB_ETHERNET_ADAPTER_MAC_LIST即可
额外提示
你的重置脚本里第一条命令写错了,缺少manage.py,正确写法是python manage.py makemigrations app,否则执行会直接报错。
内容的提问来源于stack exchange,提问作者xtlc
相关产品推荐
相关产品推荐

