Django连接MySQL数据库django.core.exceptions.ImproperlyConfigured错误

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43265998/article/details/100579073

Django2.0版本之后,在使用自己创建app中的__init__.py文件中调用pymysql包,使用如下语句

import pymysql
pymysql.install_as_MySQLdb()

当运行时会出现如下错误:
在这里插入图片描述
在网上搜了很多攻略,其中的一些方法是找到Python安装路径下的Python36-32\Lib\site-packages\django\db\backends\mysql\base.py文件
将文件中的如下代码注释掉即可:

if version < (1, 3, 3):
    raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

但是,这也不是长久办法,毕竟这些内置的语句,都有它存在的道理,注释掉之后,说不定之后就会在遇到什么乱七八糟的东西。
原因是处在了app中__init__.py文件中写的那一句话中。因为之前MySQLdb不支持Python3.5,所以使用pymysql.install_as_MySQLdb(),来时用pymysql来代替MySQLdb,但是pymysql的版本又不符合mysqlclient的需求,所以才报错。
解决办法:
最新版本的MySQLclient进行了优化,并不需要在__init__.py中写那一句话,也可以直接连接MySQL。所以app中__init__.py中不写那一句话就可以执行了。
这样就结束了吗?
还有新的错误:
在这里插入图片描述

TypeError: __init__() missing 1 required positional argument: 'on_delete'

在使用ORM进行数据库操作的时候,假如创建的有一对一或者一对多的连表时,会有这样的问题。

一对一(OneToOneField)

class OneToOneField(ForeignKey):
    def __init__(self, to, on_delete, to_field=None, **kwargs):
        kwargs['unique'] = True
        super().__init__(to, on_delete, to_field=to_field, **kwargs)

一对多(ForeignKey)

class ForeignKey(ForeignObject):
    def __init__(self, to, on_delete, related_name=None, related_query_name=None,
                 limit_choices_to=None, parent_link=False, to_field=None,
                 db_constraint=True, **kwargs):
        super().__init__(to, on_delete, from_fields=['self'], to_fields=[to_field], **kwargs)

多对多(ManyToManyField)

class ManyToManyField(RelatedField):
    def __init__(self, to, related_name=None, related_query_name=None,
                 limit_choices_to=None, symmetrical=None, through=None,
                 through_fields=None, db_constraint=True, db_table=None,
                 swappable=True, **kwargs):
        super().__init__(**kwargs)

可以看到,在这两个类定义的时候,在__init__()函数中,都有一个叫做on_delete的参数,这也是为什么在创建一对一、一对多链表操作的时候会报错的原因。而在多对多的链表操作中却没有这个参数,所以在创建多对多的表格时,不用考虑这个属性。

那么on_delete都有什么值?

on_delete=None,               # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做
on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL,    # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET,         # 删除关联数据,
 a. 与之关联的值设置为指定值,设置:models.SET()
 b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

参考链接:
https://blog.csdn.net/buxianghejiu/article/details/79086011

猜你喜欢

转载自blog.csdn.net/weixin_43265998/article/details/100579073