[已解决]django.db.utils.OperationalError: no such table: onlyoffice_customuser

这个问题的原因显而易见,数据库中没有数据库表 onlyoffice_customuser,但是你却想要使用它。

排除因为 sqlite3 数据库放错位置的情况(路径问题),那就是真的没有这个表。

但我是执行数据库迁移命令报错的:

python manage.py makemigrations

还没开始就结束了?

我的原因:
我这里的问题在于,我写了个全局变量:

FILES = get_all_files()

这个函数调用了数据库。

def get_all_files():
    files = list(FileModel.objects.all())
    return files

因为 全局变量是顶格写的,所以在加载 *.py 文件时就会直接运行,导致数据库还没建立就先被查询了。

我的解决办法:不直接只用全局变量,改为通过函数获取全局变量。
把 FILES = get_all_files() 注释掉,改为:

FILES = None
def get_all_files():
    global FILES
    if not FILES:
        FILES = list(FileModel.objects.all())
    return FILES

只有在需要用 FILES 时才调用 get_FILES 函数,避免因为顶格赋值而被提早调用。


下面是我探索的过程,可不看。

我写了个类 Curstomuser
重新运行命令:

>python manage.py makemigrations

就报错了:
报错截图
我以为是自己设计的类有问题,结果发现是因为我在其它 py 文件中进行了数据库查询。
而 Django 架构让我忽略了代码运行的前后关系。。。
先注释掉其它 py 文件中的调用:
在这里插入图片描述
再次运行即可。


这是一种原因,还有一次我删除了数据库,修改了models.py 里的model,再次运行也报类似的错:
no such table
打开数据库,发现里面空白一片,确实没有创建这个表,而且其它表也没创建:
数据库中没有表
我很迷啊。
解决:
在项目的根目录下有个缓存文件夹:pycache
__pycache__文件夹内容
这个文件夹里的内容,就是缓存。我们重复去编译的时候,肯定会受到缓存的影响。所以我删除了整个缓存文件夹,反正下次会自动再生成。
但是,不好意思,并没用。我把可以删除的都删除了,然并。

退一步,注释了新model的内容调用,包括models.py 文件中的新 model 定义,只保留老的内容,再运行命令总行了吧。
没有反转,还真行了。。。。

所以,估计还是调用顺序的问题。我删除刚生成的文件,重新来一遍测试一下。
删除了001,002...
没毛病,就是调用的问题:
在这里插入图片描述
所以,只要注释掉自定义的 model 被调用的地方,就能运行成功。我不理解为什么,但大受震撼。我猜测还是代码调用顺序问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值