Django更新models数据库结构步骤


Posted in Python onApril 01, 2020

有时候在我们使用Django设计了models中的数据库结构,并且已经同步了数据库之后,我们突然想在数据表中更新或者增加新的字段,也就是需要修改数据库的结构,会出现以下的问题:

C:\Users\Administrator\Desktop\Web开发\Django_Demo\jkxy>python manage.py makemigrations
You are trying to add a non-nullable field 'grade' to student without a default; we can't do that (the dat
abase needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option:

就是在我们在models中修改了表的字段后,进行python manage.py makemigrations同步数据库时会出现上面报错,会导致数据库结构更新失败

解决方法如下:

第一种方式:先删除再重构

1、删除数据库对应的数据表

注意:在这里可以不用暴力删除数据表,可以利用django的migrations进行,操作如下:

1.1、首先将自己需要重构的数据表类的models注释掉,然后输入命令python manage.py makemigrations,这个时候migration会自动记录删除数据表的操作

Django更新models数据库结构步骤

Django更新models数据库结构步骤

1.2、然后在输入命令python manage.py migrate,Django会自动将本地对应的数据库进行删除

Django更新models数据库结构步骤

2、删除应用当中的migrations文件

3、删除应用当中的pychace文件

4、删除db_sqllite文件(若配置数据库为mysql时,可以删除db_sqllite)

5、建立一个空数据库,命令为python manage.py makemigrations --empty 应用名称

C:\Users\Administrator\Desktop\Web开发\Django_Demo\jkxy>python manage.py makemigrations --empty bbs
Migrations for 'bbs':
bbs\migrations\0001_initial.py

6、同步数据库:

python manage.py makemigrations
python manage.py migrate

 
C:\Users\Administrator\Desktop\Web开发\Django_Demo\jkxy>python manage.py makemigrations --empty bbs
Migrations for 'bbs':
 bbs\migrations\0001_initial.py
 
C:\Users\Administrator\Desktop\Web开发\Django_Demo\jkxy>python manage.py makemigrations
Migrations for 'bbs':
 bbs\migrations\0002_student_testmyfield.py
 - Create model Student
 - Create model Testmyfield
 
C:\Users\Administrator\Desktop\Web开发\Django_Demo\jkxy>python manage.py migrate
Operations to perform:
 Apply all migrations: admin, auth, bbs, contenttypes, sessions
Running migrations:
 Applying contenttypes.0001_initial... OK
 Applying auth.0001_initial... OK
 Applying admin.0001_initial... OK
 Applying admin.0002_logentry_remove_auto_add... OK
 Applying contenttypes.0002_remove_content_type_name... OK
 Applying auth.0002_alter_permission_name_max_length... OK
 Applying auth.0003_alter_user_email_max_length... OK
 Applying auth.0004_alter_user_username_opts... OK
 Applying auth.0005_alter_user_last_login_null... OK
 Applying auth.0006_require_contenttypes_0002... OK
 Applying auth.0007_alter_validators_add_error_messages... OK
 Applying auth.0008_alter_user_username_max_length... OK
 Applying bbs.0001_initial... OK
 Applying bbs.0002_student_testmyfield... OK
 Applying sessions.0001_initial... OK

第二种方式:直接在原结构上更新结构

#出版社
class Publisher(models.Model):
 '''出版社数据表'''
 id=models.AutoField(primary_key=True) #自增ID主键
 name=models.CharField(max_length=50,verbose_name='出版社名称',null=False,unique=True)
 
 def __str__(self):
  return '{},{}'.format(self.id,self.name)

接下来我们需要新增一个字段addr地址

#出版社
class Publisher(models.Model):
 '''出版社数据表'''
 id=models.AutoField(primary_key=True) #自增ID主键
 name=models.CharField(max_length=50,verbose_name='出版社名称',null=False,unique=True)
 addr=models.CharField(max_length=128,verbose_name='出版社地址')
 
 def __str__(self):
  return '{},{}'.format(self.id,self.name,self.addr)

由于我们的数据库的Publisher表本身已经有数据了,所以我们在进行python manage.py makemigrations会出现以下错误:

Django更新models数据库结构步骤

上图的意思是说addr没有默认值,无法更新到数据库中,然后给出了两个选项:

第一是让你马上给定一个默认值,然后一次性的把所有addr都写成这个值

第二是先退出,你自己在models里面去配置默认值

我选择先退出,在models中加上默认值,在进行makemigrations,这次就会更新成功了!

#出版社
class Publisher(models.Model):
 '''出版社数据表'''
 id=models.AutoField(primary_key=True) #自增ID主键
 name=models.CharField(max_length=50,verbose_name='出版社名称',null=False,unique=True)
 addr=models.CharField(max_length=128,verbose_name='出版社地址',default='成都市动物园')
 
 def __str__(self):
  return '{},{}'.format(self.id,self.name,self.addr)

Django更新models数据库结构步骤

让我们来检查数据库中的数据表:

Django更新models数据库结构步骤

可以看到数据结构发生了变化!

以上这篇Django更新models数据库结构步骤就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python的chardet库获得文件编码并修改编码
Jan 22 Python
Python发送email的3种方法
Apr 28 Python
Python实现处理管道的方法
Jun 04 Python
Python 绘图和可视化详细介绍
Feb 11 Python
python字符串中的单双引
Feb 16 Python
Python构建XML树结构的方法示例
Jun 30 Python
Python使用Matplotlib实现雨点图动画效果的方法
Dec 23 Python
python奇偶行分开存储实现代码
Mar 19 Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 Python
python基础教程之while循环
Aug 14 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
Jan 28 Python
Python利用myqr库创建自己的二维码
Nov 24 Python
pycharm工具连接mysql数据库失败问题
Apr 01 #Python
利用Python自动化操作AutoCAD的实现
Apr 01 #Python
python使用信号量动态更新配置文件的操作
Apr 01 #Python
python和pywin32实现窗口查找、遍历和点击的示例代码
Apr 01 #Python
python自动脚本的pyautogui入门学习
Apr 01 #Python
Python自动重新加载模块详解(autoreload module)
Apr 01 #Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 #Python
You might like
基于empty函数的判断详解
2013/06/17 PHP
php中的观察者模式简单实例
2015/01/20 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
Python中交换两个元素的实现方法
2018/06/29 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
详解Python中namedtuple的使用
2020/04/27 Python
解决python运行启动报错问题
2020/06/01 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
Python pip 常用命令汇总
2020/10/19 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
总务岗位职责
2013/11/19 职场文书
大门门卫岗位职责
2013/11/30 职场文书
新教师工作感言
2014/02/16 职场文书
警示教育活动总结
2014/05/05 职场文书
财务工作检讨书
2014/10/29 职场文书
小学运动会报道稿
2015/07/22 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers