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中列表生成式的用法
Mar 31 Python
使用Kivy将python程序打包为apk文件
Jul 29 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 Python
详解Numpy中的广播原则/机制
Sep 20 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
Oct 22 Python
python实现事件驱动
Nov 21 Python
Django实现跨域请求过程详解
Jul 25 Python
如何通过python实现全排列
Feb 11 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
Pandas实现一列数据分隔为两列
May 18 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
PyTorch 中的傅里叶卷积实现示例
Dec 11 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
apache php模块整合操作指南
2012/11/16 PHP
php变量作用域的深入解析
2013/06/03 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
javascript实时显示北京时间的方法
2015/03/12 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
毕业求职自荐信格式是什么
2013/11/19 职场文书
小车司机岗位职责
2013/11/25 职场文书
应用心理学个人求职信范文
2013/12/11 职场文书
自荐信需注意事项
2014/01/25 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
2015年林业工作总结
2015/05/14 职场文书
法制教育观后感
2015/06/17 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书