Backend - Django makemigrations

news/2024/7/9 21:22:13 标签: django, 数据库, sqlite, postgresql

目录

一、迁移命令

(一)前提

(二)生成迁移文件

(三)执行迁移

二、迁移问题

1. Error:No changes detected

2. Error:You are trying to add a non-nullable field 'XXX' to XXX without a default 

解决方法(1)根据系统提供的选项,选择1

解决方法(2)根据系统提供的选项,选择2

        ① 增加 null = True 属性

        ② 增加 default = " "  属性

        ③ 删除有问题的model

        ④ 检查migrations文件

django.db.utils.OperationalError%3A%20connection%20to%20server%20at%20%2210.XXX.X.X%22%2C%20port%205432%20failed%3A%20FATAL%3A%C2%A0%20password%20authentication%20failed%20for%20user%20%22XXX%22-toc" style="margin-left:80px;">3. Error:django.db.utils.OperationalError: connection to server at "10.XXX.X.X", port 5432 failed: FATAL:  password authentication failed for user "XXX"

django%5Cdb%5Cmigrations%5Coperations%5Cmodels.py%22%2C%20line%20677%2C%20in%20state_forwards%E3%80%82model_state%20%3D%20state.models%5Bapp_label%2C%20self.name_lower%5D%E3%80%82KeyError%3A%20('luoboapp'%2C%20'Book')-toc" style="margin-left:80px;">4. Error:File "D:\XXX\venv368\lib\site-packages\django\db\migrations\operations\models.py", line 677, in state_forwards。model_state = state.models[app_label, self.name_lower]。KeyError: ('luoboapp', 'Book')

原因:

解决:

django%5Cdb%5Cbackends%5Cutils.py%22%2C%20line%2084%2C%20in%20_execute%E3%80%82return%20self.cursor.execute(sql%2C%20params)%E3%80%82django.db.utils.IntegrityError%3A%20column%20%22author_id_id%22%20of%20relation%20%22Book%22%20contains%20null%20values-toc" style="margin-left:80px;">5. File "D:\XXX\venv368\lib\site-packages\django\db\backends\utils.py", line 84, in _execute。return self.cursor.execute(sql, params)。django.db.utils.IntegrityError: column "author_id_id" of relation "Book" contains null values

原因:

解决:


一、迁移命令

(一)前提

        若是修改 / 新增 表结构,需先保证原来产生的迁移文件还保留着。

(二)生成迁移文件

# 终端执行
python manage.py makemigrations BookApp

# 其中,BookApp是Application专案名,方便找到唯一的models.py文件
# Application具体是在settings.py文件中设置的。即:INSTALLED_APPS = ['BookApp']

(三)执行迁移

# 终端执行
python manage.py migrate

二、迁移问题

1. Error:No changes detected

        原因:未指定执行的Application。

        解决如下:

# 终端执行
# 1.这是遇到问题的终端命令
python manage.py makemigrations BookApp

python manage.py migrate

# 2.这是修改过后的终端命令
python ./manage.py makemigrations BookApp

python manage.py migrate

2. Error:You are trying to add a non-nullable field 'XXX' to XXX without a default 

解决:

解决方法(1)根据系统提供的选项,选择1

        选择1,则代表系统自动设置默认属性,并让用户提供一个默认值。

        即,操作:先输入1,回车,再输入任意值,回车。

        若还有其他栏位也是出现这种情况,继续选择1,输入默认值。

解决方法(2)根据系统提供的选项,选择2

        选择2,则用户自定义设置。

        即,操作:输入2,直接退出。

        输入2退出指令后,再接着用以下其一操作来解决:

        ① 增加 null = True 属性

                操作:给字段添加允许为空的属性,下指令,然后恢复字段,又下指令(该操作类似于系统选项1的解决办法)。

        ② 增加 default = " "  属性

                操作:给字段添加默认值的属性,下指令,然后恢复字段,又下指令。

        ③ 删除有问题的model

                操作:删除该model,下指令,然后恢复model,又下指令。

        ④ 检查migrations文件

                注意:若确定栏位没有问题,则确保之前的migrations文件没有问题。

django.db.utils.OperationalError%3A%20connection%20to%20server%20at%20%2210.XXX.X.X%22%2C%20port%205432%20failed%3A%20FATAL%3A%C2%A0%20password%20authentication%20failed%20for%20user%20%22XXX%22">3. Error:django.db.utils.OperationalError: connection to server at "10.XXX.X.X", port 5432 failed: FATAL:  password authentication failed for user "XXX"

        解决:确保项目settings.py文件上设置的数据库 'USER' 和 'PASSWORD' 的值,与在 PostgreSQL数据库 中创建的用户名和密码匹配。

django%5Cdb%5Cmigrations%5Coperations%5Cmodels.py%22%2C%20line%20677%2C%20in%20state_forwards%E3%80%82model_state%20%3D%20state.models%5Bapp_label%2C%20self.name_lower%5D%E3%80%82KeyError%3A%20('luoboapp'%2C%20'Book')">4. Error:File "D:\XXX\venv368\lib\site-packages\django\db\migrations\operations\models.py", line 677, in state_forwards。model_state = state.models[app_label, self.name_lower]。KeyError: ('luoboapp', 'Book')

原因:

该model(如Book)被其他model(如Library)进行了外键关联,在其他model有一些栏位的变动并下迁移指令时,会寻找该model(如Book)。

若该model(如Book)此时已经重命名了(系统在最后才会更新该model名,如LuoboBook,而其他model关联的是旧该model名,如Book),则其他model就找不到该model(如LuoboBook),则会报错。

解决:

在执行迁移文件时,选择不要重新命名Book模型名。输入N。

如 Did you rename the luoboapp.Book model to LuoboBook? [y/N] N

再操作:把model还原成以前的model名(如Book)。再删掉新生成的migration文件,重新下指令。生成新的migration文件后,再将model名改成新名字(如LuoboBook)。再下指令,生成第二个新的migration文件。然后就能成功执行migrate。

django%5Cdb%5Cbackends%5Cutils.py%22%2C%20line%2084%2C%20in%20_execute%E3%80%82return%20self.cursor.execute(sql%2C%20params)%E3%80%82django.db.utils.IntegrityError%3A%20column%20%22author_id_id%22%20of%20relation%20%22Book%22%20contains%20null%20values">5. File "D:\XXX\venv368\lib\site-packages\django\db\backends\utils.py", line 84, in _execute。return self.cursor.execute(sql, params)。django.db.utils.IntegrityError: column "author_id_id" of relation "Book" contains null values

原因:

        该model有新增的字段,但是该model对应的数据库表还存在原来的数据记录。

解决:

        清空该model对应的表的所有数据。

以上大部分问题是数据库同步有误、或migrations文件有冲突。

若实在找不到方法解决类似问题,则使用简单粗暴的方法。

即,把migrations文件夹的所有py文档删除(除了__init__.py),再把数据库删除重新创建。若担心操作有误,可以提前备份。


http://www.niftyadmin.cn/n/5238880.html

相关文章

solidity实现ERC1155多代币标准

文章目录 1、NFT - 维基百科2、IERC1155MetadataURI3、IERC1155Receiver4、IERC11555、ERC11556、NFT11557、开源地址 1、NFT - 维基百科 ERC-1155 标准于2018年6月由Witek Radomski、Andrew Cooke、Philippe Castonguay、James Therien、Eric Binet及Ronan Sandford提出。此标…

Kubernetes(K8s) Ingress介绍-08

Ingress介绍 在前面课程中已经提到,Service对集群之外暴露服务的主要方式有两种:NotePort和LoadBalancer,但是这两种方式,都有一定的缺点: NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务…

Android 14 CarAudioService

文章目录 新功能AudioMirringoemCarService 新功能 AudioMirring 简单的说就是两个bus输出的是同一个音频数据。 构建的流程是: 一个输入src的bus,和两个输出dst的bus。 通过setParamter 设置到hal。 hal解析这些参数,将输入bus 的音频数据…

QGIS之二十六pbf转osm转shp

效果 步骤 1、下载工具 用于转换osm.pbf–>.osm,当然也可以反过来,还支持其它格式互相转换 osmconvert64-0.8.8p.exe 链接:https://pan.baidu.com/s/1Mj-6b30f6voOkQI8QFh_rw 提取码:1111 2、国内各省下载OSM数据 http://download.openstreetmap.fr/extracts/asia/c…

redis的keys命令和scan命令性能对比

项目场景 Redis的keys *命令在生产环境是慎用的,特别是一些并发量很大的项目,原因是Redis是单线程的,keys *会引发Redis锁,占用reids CPU,如果key数量很大而且并发是比较大的情况,效率是很慢的&#xff0c…

活动回顾|德州仪器嵌入式技术创新发展研讨会(上海站)成功举办,信驰达科技携手TI推动技术创新

2023年11月28日,德州仪器(TI)嵌入式技术创新发展研讨会在上海顺利举办。作为TI中国第三方IDH,深圳市信驰达科技有限公司受邀参加,并设置展位,展出CC2340系列低功耗蓝牙模块及TPMS、蓝牙数字钥匙解决方案,与众多业内伙伴…

【广州华锐互动】风电场检修VR情景模拟提供接近真实的实操体验

风电场检修VR情景模拟系统由广州华锐互动开发,这是一种新兴的培训方式,它通过虚拟现实技术将风力发电场全范围进行1:1仿真建模还原,模拟监视风力发电场各种运行工况下的运行参数和指标,同时可进行升压站系统的巡视,倒闸…

InnoDB的B+树索引(一)

文章目录 概要一、InnoDB行格式二、InnoDB数据页结构2.1 User Records2.2 两个虚拟行记录2.3 PageDirectory(页目录)2.4 File Header(文件头部) 三、B树索引3.1 B树索引结构3.2 先有根节点再有叶子节点3.3 一条记录在索引中的查找…