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绘制MySQL数据图实现数据可视化
Mar 30 Python
Python编写百度贴吧的简单爬虫
Apr 02 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
让python在hadoop上跑起来
Jan 27 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
Python中itertools的用法详解
Feb 07 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
Python爬虫HTPP请求方法有哪些
Jun 03 Python
Python如何实现线程间通信
Jul 30 Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 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
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
php模板函数 正则实现代码
2012/10/15 PHP
PHP基础之运算符的使用方法
2013/04/28 PHP
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
Javascript常考语句107条收集
2010/03/09 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
python实现的简单抽奖系统实例
2015/05/22 Python
Python实现购物车购物小程序
2018/04/18 Python
Python数据集切分实例
2018/12/08 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
tensorflow多维张量计算实例
2020/02/11 Python
Python hashlib模块的使用示例
2020/10/09 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
大学班级计划书
2014/04/29 职场文书
社区助残日活动总结
2014/08/29 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
创业计划书之物流运送
2019/09/17 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
Java死锁的排查
2022/05/11 Java/Android