Django更新models数据库结构步骤

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

有时候在我们使用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

标签:Django,models,数据库,结构
0
投稿

猜你喜欢

  • Pytorch结合PyG实现MLP过程详解

    2022-05-01 21:51:55
  • windows系统Tensorflow2.x简单安装记录(图文)

    2023-02-22 04:41:23
  • 2019最新的Pycharm激活码(推荐)

    2023-11-17 00:49:37
  • python基础教程项目五之虚拟茶话会

    2022-10-25 02:08:47
  • MySQL数据库的事务和索引详解

    2024-01-21 00:40:48
  • 详解JDBC对Mysql utf8mb4字符集的处理

    2024-01-14 12:01:43
  • Python基础之函数基本用法与进阶详解

    2023-07-13 07:57:46
  • 详解Python解决抓取内容乱码问题(decode和encode解码)

    2021-12-18 09:26:29
  • 使用python实现哈希表、字典、集合操作

    2023-11-24 21:09:13
  • 利用Python创建第一个Django框架程序

    2022-08-08 02:21:26
  • 在 Python 应用中使用 MongoDB的方法

    2023-09-13 21:53:11
  • BOF、EOF 属性

    2009-05-11 12:37:00
  • 详解Python中如何写控制台进度条的整理

    2023-12-31 03:32:51
  • python方向键控制上下左右代码

    2022-01-27 01:44:22
  • Python在Windows和在Linux下调用动态链接库的教程

    2022-01-10 04:55:51
  • Python 短视频爬虫教程

    2022-02-13 00:17:33
  • 一个简单的ASP计数器代码

    2010-04-24 15:49:00
  • 在ASP.NET 2.0中操作数据之二十三:基于用户对修改数据进行限制

    2023-07-12 08:52:20
  • @ResponseBody 和 @RequestBody 注解的区别

    2024-04-16 09:35:00
  • 4种JavaScript实现简单tab选项卡切换的方法

    2024-02-23 10:25:51
  • asp之家 网络编程 m.aspxhome.com