网站提示域名重定向怎么做centos做网站服务器吗
网站提示域名重定向怎么做,centos做网站服务器吗,做图素材网站开哪个vip好,宝安网站公司Django 迁移系统全指南#xff1a;从模型到数据库的魔法之路
前言
你是否曾经遇到过这样的困扰#xff1a;写好了一个 Python 的 models.py 文件#xff0c;却发现不知道怎么在数据库中创建对应的表#xff1f;或者修改了模型定义后#xff0c;手动去数据库改表结构改得…Django 迁移系统全指南从模型到数据库的魔法之路前言你是否曾经遇到过这样的困扰写好了一个 Python 的models.py文件却发现不知道怎么在数据库中创建对应的表或者修改了模型定义后手动去数据库改表结构改得焦头烂额别担心Django 的迁移系统就是为了解决这个问题而生的今天我们就来深入了解一下这个强大的工具。一、什么是 Django 迁移系统Django 迁移系统是一个自动化的数据库版本控制系统它可以自动检测模型变化生成迁移文件记录变化历史自动执行 SQL来更新数据库简单来说你只需要写 Python 代码剩下的事情 Django 都帮你搞定二、核心概念两个命令2.1python manage.py makemigrations- 施工图纸这个命令负责检测模型变化并生成迁移文件。# apps/students/models.pyclassStudent(models.Model):namemodels.CharField(max_length100)agemodels.IntegerField()# 假设这是我们新增的字段运行命令后$ python manage.py makemigrations Migrationsforstudents:apps/students/migrations/0002_add_age_field.py - Add field age to studentDjango 会在apps/students/migrations/目录下生成一个新的 Python 文件# 0002_add_age_field.pyfromdjango.dbimportmigrations,modelsclassMigration(migrations.Migration):dependencies[(students,0001_initial),]operations[migrations.AddField(model_namestudent,nameage,fieldmodels.IntegerField(),),]⚠️ 注意这个命令不会修改数据库它只是准备了施工图纸。2.2python manage.py migrate- 真正施工这个命令负责执行迁移文件并修改数据库。$ python manage.py migrate Running migrations: Applying students.0002_add_age_field... OKDjango 会读取刚才生成的迁移文件执行相应的 SQLALTERTABLEstudents_studentADDCOLUMNageINT;并且会在django_migrations表中记录这个迁移已经被应用防止重复执行。三、两者的关系可以用一个简单的类比来理解┌─────────────────────────────────────────────────────────┐ │ makemigrations 编写施工图纸 │ │ (检测模型变化生成迁移文件) │ └──────────────────────┬──────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ migrate 按照图纸施工 │ │ (执行 SQL修改数据库) │ └─────────────────────────────────────────────────────────┘四、完整的工作流程场景为学生表添加性别字段第一步修改模型# apps/students/models.pyclassStudent(models.Model):namemodels.CharField(max_length100,verbose_name姓名)agemodels.IntegerField(verbose_name年龄)gendermodels.CharField(max_length10,choices[(male,男),(female,女)],defaultmale,verbose_name性别)# 新增字段第二步生成迁移文件$ python manage.py makemigrations Migrationsforstudents:apps/students/migrations/0003_add_gender_field.py - Add field gender to student第三步应用迁移$ python manage.py migrate Running migrations: Applying students.0003_add_gender_field... OK第四步查看结果mysqlDESCRIBEstudents_student;---------------------------------------------------------|Field|Type|Null|Key|Default|Extra|---------------------------------------------------------|id|bigint|NO|PRI|NULL|auto_increment||name|varchar(100)|NO||NULL|||age|int|NO||NULL|||gender|varchar(10)|NO||male||---------------------------------------------------------搞定数据库表已经自动更新了五、Django 会自动做什么✅ Django ORM 自动处理的操作示例生成的 SQL创建表创建Student模型CREATE TABLE添加字段新增gender字段ALTER TABLE ADD COLUMN修改字段修改name字段长度ALTER TABLE MODIFY COLUMN删除字段删除age字段ALTER TABLE DROP COLUMN创建索引indexTrueCREATE INDEX外键关系ForeignKeyFOREIGN KEY多对多ManyToManyField自动创建中间表❌ Django 不会做的创建数据库本身需要手动执行CREATE DATABASE删除数据库数据库的备份和恢复六、典型场景示例场景 1项目初始化# 1. 创建数据库手动做一次mysql-uroot-pCREATE DATABASE myproject CHARACTER SET utf8mb4;exit;# 2. 配置 settings.pyDATABASES{default:{ENGINE:django.db.backends.mysql,NAME:myproject,USER:root,PASSWORD:password,HOST:localhost,PORT:3306,}}# 3. 运行迁移创建所有表python manage.py migrate场景 2开发过程中修改模型# 修改 models.py 后python manage.py makemigrations# 检测变化python manage.py migrate# 应用到数据库场景 3团队协作# 同事 A 修改了模型并提交代码gitpull# 同事 B 拉取代码后python manage.py makemigrations# 检查是否有新迁移python manage.py migrate# 应用迁移七、常见问题与解决方案Q1: 如果数据库表已经存在怎么办情况 1表是通过 SQL 手动创建的# 先创建空迁移不执行 SQLpython manage.py makemigrations--empty# 然后标记为已应用告诉 Django 表已存在python manage.py migrate--fake情况 2数据库为空直接运行迁移python manage.py migrateQ2: 如何查看迁移历史# 查看所有迁移python manage.py showmigrations# 查看某个应用的迁移python manage.py showmigrations students# 查看迁移将执行的 SQL不实际执行python manage.py sqlmigrate students 0002Q3: 如何撤销迁移# 撤销最后一次迁移未应用python manage.py migrate students 0001# 删除迁移文件未应用rmapps/students/migrations/0002_add_age_field.pyQ4: 迁移冲突怎么办当多人同时修改同一个模型时可能出现冲突# 1. 创建新的迁移解决冲突python manage.py makemigrations--merge# 2. 应用迁移python manage.py migrate八、最佳实践✅ 推荐做法每次修改模型后立即运行迁移python manage.py makemigrationspython manage.py migrate将迁移文件纳入版本控制gitaddapps/*/migrations/*.pygitcommit-mAdd age field to Student不要手动修改迁移文件迁移文件由 Django 自动生成和依赖手动修改可能导致问题生产环境部署前先在测试环境验证# 测试环境python manage.py migrate--plan# 查看将要执行的操作❌ 避免的做法不要直接修改数据库表结构不要删除已应用的迁移文件不要在生产环境运行makemigrations九、总结对比表特性makemigrationsmigrate作用检测模型变化生成迁移文件执行迁移修改数据库修改数据库❌ 不修改✅ 执行 SQL产生文件✅ 生成.py文件❌ 不产生文件何时使用修改models.py后生成迁移文件后执行次数每次修改模型每次有新迁移可以撤销可以删除未应用的迁移可以回退到之前的版本十、进阶技巧1. 查看迁移计划不执行python manage.py migrate--plan2. 只运行特定应用的迁移python manage.py migrate students3. 回退到指定迁移python manage.py migrate students 00014. 生成空的迁移用于自定义操作python manage.py makemigrations--emptystudents结语Django 的迁移系统是一个强大而优雅的数据库管理工具它让开发者能够专注于业务逻辑而不是繁琐的 SQL 操作。记住这两个命令python manage.py makemigrations# 检测变化生成迁移文件python manage.py migrate# 应用迁移修改数据库就这么简单相关资源Django 官方文档 - 迁移Django 官方文档 - 操作希望这篇博客能帮助你理解 Django 的迁移系统如果还有疑问欢迎留言讨论