Django开发,日常错误。

本文探讨了Django框架及Python编程中常见的问题与解决策略,包括Django迁移错误修复、cx_Oracle模块中文乱码处理、多线程环境下数据冲突避免、get_or_create()方法的线程安全问题,以及数据上传限制调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、migrate失败

错误如下:

django.db.utils.ProgrammingError: relation "user" already exists

解决方式:

python3 manage.py migrate mfxx (migrations文件) --fake-initial

关于fake和fake-initial参数 以及其他的一些migrate可选用参数

  • –fake
    • migrate命令的–fake参数在官方文档中的解释是,记录或消除migrate记录,但不去真的运行SQL以改变数据结构。
    • 换句话说,一般的migrate的流程是
      • 1.读取migrations文件,解析成SQL;
      • 2.执行SQL改变数据库结构或内容;
      • 3.将本次migrate的信息录入django_migrations。
      • 但是如果加上–fake参数,那么第2步会被直接跳过而变更直接被记录到django_migrations中。
    • 这个参数的使用场景常常是这样的: 当一个migration文件执行出错,而我们明确知道这个错该如何修正,我们完全可以手动去对数据库结构做一些修改。然后再带–fake参数地运行本次变更对应的migration文件。“假装”我们正确地做了一次migrate。
  • –fake-initial
    • –fake-initial的原理是类似的,只不过其针对的只是执行0001_initial这个文件。所以说fake-initial的使用场景更加狭窄,即上面所说的对于数据库中有结构,但是0001_initial.py重新生成并且需要写入django_migrations记录时,用到这个参数。
  • sqlmigrate
    • 另外migrate还有一个比较有用的参数是sqlmigrate。其用法是sqlmigrate app 000x_xxx。它的意思是将某个特定的migrations文件翻译成SQL打印到屏幕上。我们手动去执行这些SQL效果和自动去migrate的效果是一样的。因此在自动migrate时出错的时候,可以利用sqlmigrate打印出SQL,具体查看哪些SQL有问题。如果可以排除,那么可以手动修改出错的SQL并执行,再带有–fake参数执行下这个migrate即可。

二、在使用cx_Oracle模块中文乱码

在使用cx_Oracle模块读取oracle数据中的中文数据的时候,返回值是????, 解决方案:

import os 
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' 

三、在使用django多线程时引发的问题

在使用多线程的时候,需要考虑数据库存储时间问题。
多线程意味着django可以同时处理多个请求
下面有一个情景:
有一个用来存储数据的接口,逻辑是先利用主键判断这条数据是否已经存在,如果存在则返回“此数据已经存在”,否则存下来。
某时候。同时收到两个完全一样的请求,要存贮的数据也完全一样。两个请求同时判断了数据是否已经存在,很显然,不存在,然后两个请求一起存储数据,这是其中一个请求会引发IntegrityError的错误。
这虽然影响不大,但还需注意。
如果有需求的话,可以将这个主键存在redis中,有效期可以设置1小时,redis的速度是非常快的。

四、get_or_create()一条记录被创建了两次

理论上不会被创建两次,但在多线程下确实有可能的。

五、Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.

完整的报错日志:

ERROR 2019-09-24 09:27:23,160 scheme:https path:/asset/api/interface/ method:POST data:<QueryDict: {}>
Traceback (most recent call last):
  File "/code/asset_apps/main/views/error_Traceback.py", line 20, in wrap
    return function(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py", line 63, in bound_func
    return func.__get__(self, type(self))(*args2, **kwargs2)
  File "/code/asset_apps/main/service/Interface.py", line 407, in post
    data = json.loads(request.body)
  File "/usr/local/lib/python3.6/site-packages/django/http/request.py", line 269, in body
    raise RequestDataTooBig('Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')
django.core.exceptions.RequestDataTooBig: Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.

其实翻译过来就是:请求体超出设置
DATA_UPLOAD_MAX_MEMORY_SIZE:这个设置翻译过来就是:数据上传最大内存大小
默认大小是2.5M,如果有需要可以自己重新设置,以字节为单位:

DATA_UPLOAD_MAX_MEMORY_SIZE = 10485760    # 设置为最大10M
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值