0
点赞
收藏
分享

微信扫一扫

Django ORM使用问题小记

young_d807 2022-04-02 阅读 77

一、执行python manage.py makemigrations app时报错:“You are trying to add a non-nullable field 'name' to contact without a default; we can't do that (the database needs something to populate existing rows)"

原因:

新添加不允许为null、且没有设置defaul的字段时报错。

合理,数据库内存量记录需要默认值填充该字段。

解决方法:

在Django项目app应用下的model.py里,为各个字段设置default。

二、执行python manage.py migrate时告警:“MySQL Strict Mode is not set for database connection 'default'
    HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-sql-mode”。

原因:

数据库的strict模式没有启用。

解决方法:

可以修改数据库配置文件。

也可以无需修改数据库配置文件,在Django项目下的settings.py中添加如下配置项:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxxx',
        'HOST': 'xxxx',
        'PORT': xxxx,
        'USER': 'xxxx',
        'PASSWORD': 'xxxxxxxx',
        'OPTIONS': {
            "init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
        }
    }
}

三、使用Django ORM,在应用下的model.py中为字段设置了default。但在执行迁移命令后,生成的数据库表内default未生效:执行describe 表名称查看到Default都为NULL,且执行show create table 表名称发现创建表结构时并未设置default。

原因:

Django的默认值是在框架层面:就是说使用该框架编程来执行insert操作时,是可以生效,自动设置默认值的。

但在数据库层面不行:执行Django迁移命令创建表结构时,并不会在数据库层面设置default。即如果用sql语句或其他框架来执行insert操作,不会自动设置默认值。

解决方法:

当项目仅使用Django ORM框架操作数据库,没有问题。

如果需要使用sql语句添加记录,需要自己填写该字段值,哪怕Django里已设置过默认值。

四、为什么数据库设置的NULL为NO,但在insert时不插入该字段也可以成功?

原因:

概念理解问题:not null不等于不可以插入空值(空字符串等)。not null 指的是不可以将该字段值设置为NULL,但是可以插入空值。

空字符串("")虽然表示“没有值”,但这个值是已知的。NULL 表示 “未知值”,这个值是未知的。

数据库中 SQL 语句该如何处理 NULL 值,你真的了解过吗?

解决方法:

不涉及。

举报

相关推荐

django ORM使用

Django ORM

Django ORM 使用手册

Django-ORM

Django ORM查询

Django后端开发——ORM

django中的orm

0 条评论