网络编程
位置:首页>> 网络编程>> 数据库>> Django更新models数据库结构步骤

Django更新models数据库结构步骤

作者:LuoZelin1989  发布时间:2024-01-16 09:05:25 

标签:Django,models,数据库,结构

有时候在我们使用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数据库结构步骤

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

来源:https://blog.csdn.net/BearStarX/article/details/84961899

0
投稿

猜你喜欢

  • 静态链表和动态链表区别静态链表和动态链表的共同点是,数据之间"一对一"的逻辑关系都是依靠指针(静态链表中称"游
  • 有时候想为我们的网页提供多语言支持,如果一种语言用一张网页来做实在太麻烦了,幸好Google提供了语言工具功能,下面介绍如何利用它来实现网页
  • 一、re是什么?正则表达式是一个特殊的字符序列,能方便的检查一个字符串是否与某种模式匹配。re模块使得python拥有全部的正则表达式功能。
  • 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的。排序,数字、字符串按照A
  • 日期和时间类型MySQL有多个表示各种日期和时间值的数据类型, 比如YEAR和DATE. MySQL存储时间的最精确粒度是秒。 然而, 能做
  • 1、su – oracle 不是必需,适合于没有DBA密码时使用,可以不用密码来进入sqlplus界面。  2、sqlplus /
  • 遇见了表中存在重复的记录的问题,直接写sql删除时最快的,才不要慢慢的复制到excel表中慢慢的人工找呢如下sql,找出重复的记录,和重复记
  • 前言接着上一篇的故事工厂模式继续,手机要出厂,显然光一个手机肯定是不行的,还需要包装盒、充电器等等东西。我们按照上一篇提到的工厂模式,去建立
  • 关于缓存剩下的问题是数据的隐私性以及在级联缓存中数据应该在何处储存的问题。通常用户将会面对两种缓存: 他或她自己的浏览器缓存(私有缓存)以及
  • 说明1、字典中没有下标的概念,使用key值访问字典中对应的value值。当访问的key值不存在时,代码会报错。2、get('key&
  • 有些时候我们发现一些模块没有提供pip install 命令和安装教程 , 只提供了一个setup.py文件 , 这个时候如何安装呢?步骤打
  • 一、类型数组是值类型,将一个数组赋值给另一个数组时,传递的是一份拷贝。切片是引用类型,切片包装的数组称为该切片的底层数组。我们来看一段代码/
  • 本文实例讲述了Python实现基于HTTP文件传输的方法。分享给大家供大家参考。具体实现方法如下:一、问题:因为需要最近看了一下通过POST
  • 下面的代码是从kesion系统扒下的,确实不错,支持utf8格式。代码如下:'===========================
  • 前言本文从代码复用的角度一步一步演示如何从python普通代码进化到面向对象,并通过代码去解释一些面向对象的理论。所以,本文前面的内容都是非
  • 前言sys模块是与python解释器交互的一个接口。sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分。处理命令行参
  • 前言版本:windows 10.0python 3.8多重继承在Python数字比较与类结构中有简略提到类,且在Python中类的mro与继
  • 有时我们用pycharm打开某个文件的时候,默认的打开方式是不正确的,那么如何设置呢?下面小编给大家分享一下。首先我们点击File菜单,然后
  • 利用pygame实现了简易版飞机大战。源代码如下:# -*- coding:utf-8 -*-import pygameimport sys
  • 报错一$ php artisan migrateIlluminate\Database\QueryException : could not
手机版 网络编程 asp之家 www.aspxhome.com