前言
- 不定时更新
- 选择记录的原因有以下两个:
- 相关问题在搜索引擎上基本上搜索不到有效的答案。
- 错误错的很有意义。
- 文章中会有很少的代码片。(这是因为我所在的这家公司保密机制做的很严格,我需要尊重它)
- 关于每个问题我重在记录和指导
- 我会在每个问题的最后我会选择性的记录一些:你可能不知道,但是有必要知道的小知识点。
第一个:Django项目中生成迁移表或者在进行pytset测试时报出某个model不能正常解析的时候。
- 一般这种情况是因为频繁的更改表关系导致的,而主要的原因是:外键关系不能得到很好的体现
- 我们分两种情况来看:
- 生成迁移表的时候(解决方法有两种)
1、如果你的公司不要求你们每次push代码的时候需要保证每个app中至多增加一个迁移文件的话,那么你可以先执行empty操作,然后再执行python manage.py makemigrations 和 python manage.py migrate
2、你需要去迁移文件中修改一个(准确来说是增加一行代码,表明其关系)。也是是在下面这个列表中添加一个表明关系的元祖(链接到外键指向的那个迁移文件即可)
dependencies = [ ('courses', '0009_auto_20191206_1616'), ]
- pytest时出现该问题。(解决方法只有一种:上述的第二种)
- 出现该问题时的表现:你的后台接口可以正常访问,但是pytest的mark.django_db装饰器会报出解析错误。
- 解决方法:是时候去手动修改迁移文件了。
- 生成迁移表的时候(解决方法有两种)
- 补充:
- 对于装饰器而言,当程序加载其所在的模块时,它就已经执行了。所以不要为那些找不到源头的错误太过担心,因为那可能是装饰器的原因。
第二个:django项目中使用进程池优化代码效率时,未报错,但反馈的数据存在差异时。(非资源竞争等常见问题)
- 这个错误我准备明天记录(也许明天也搞不定呢?哈哈),因为我在块下班的时候才定位到错误是在哪。(2020-04-22)
- 好的,最近太忙了,今天得空更新一下(2020-04-26)。
- 正文:
- 使用进程池的时候是不能看到哪个进程中的异常的,所以我用了普通的形式开多进程(也就是两个for循环,一个start,一个join的那种),然后定位到错误在数据库上。
- 开发环境用的是sqlite3,我以为是sqlite3扛不住并发查询,所以我换了线上环境postgreSQL试了试,本以为就会得到解决的,但实际上是没有的,而且报错各式各样的,不过可以肯定的是所有的错误都是在执行sql语句的时候出的问题。
- 于是我想到可能是sql连接池的问题…好吧很逼近了。
- 真正的问题在于:进程中开启多个子进程的时候它们会copy同一个sql连接,于是出现了:这个子进程的查询语句的结果还没返回,另外一个子进程使用了这个连接进行了查询操作。所以肯定会报错的。
- 解决方案是:在每个子进程start之前关闭之前的老连接。也就是:
from django import db
db.close_connection()
-
但是这样有一个不好的地方是无法使用进程池,所以我又自己造了个进程池,(核心思想是:维持一个 进程queue 存在小于4的长度即可)。
-
补充:
- 其实我是非常不想用多进程的,但是实在没办法。
- 我这样说的目的是,当你遇到处理数据影响性能的时候,你可以首先考虑:分组聚合操作(django在这方面做的是很不错的)。