





改了数据库字段,结果整个程序报错,数据还对不上,你是不是经常碰到这种状况?别慌,这差不多是每个开发人员都会踩到的坑。数据库迁移就是为了解决这个让人头疼的痛点才产生的。
有一种方法,它被称作数据库迁移,其本质是用于管理数据库结构发生变化的。在软件开发进程里,你的需求会出现改变,随之数据模型以及它也会跟着产生变化。就拿这样的情况来说,原本仅仅需要存储用户名,然而现在忽然要添加一个手机号,处于这种时刻,你就必须对数据库进行修改。
这一过程听闻起来蛮简单,然而实际着手去做却极为繁杂。你需要以手动方式于数据库里去增添字段,并且还要确保测试环境以及线上环境皆达成同步。更为繁杂的是,倘若你要回退至先前的版本,还得记着把那些增添的字段给删除掉。
有一种工具叫数据库迁移工具,它能够自动完成这些事情,它会记录下每一次的修改情况,进而生成一个脚本文件,你只要运行这个脚本文件,数据库便会自动进行更新,根本无需手动去进行操作,要是改错了,也能够通过一键实现回退。
构建迁移脚本的进程颇为简易,你需先行针对代码之中的模型文件予以调整,诸如增添一个字段或者移除一张表之类的操作。随后执行一条指令,工具便会自行对您所做出的改动展开侦测,并创生出与之相对应的迁移脚本。
python manage.py makemigrations
此脚本借助代码编写而成,并非直接书写有SQL语句。其具备的益处在于,无论你所运用的是MySQL,还是PostgreSQL,均可采用同一种方式予以处理。工具会依据你所选用的数据库类别,自动转化为恰当的SQL语句。
将生成的脚本放置于一个专门的文件夹之中,,其文件名通常携带着时间戳,以便于你依照顺序进行管理。每一个脚本之内均清晰写明了此次所要开展的操作,例如添加一个名为“作者”的字段,,该字段的类型为文本。
能将这些脚本上交至代码仓库中,团队成员在拉取代码之后同样能够看到。如此便确保了所有人针对数据库的改动是一致的,不会出现你实施了改动我却未进行改动的情形。
python manage.py migrate
创作完迁移脚本之后,紧接着的步骤是将该脚本切实应用于数据库当中,你仅仅需要去运行一条指令,如此一来工具便会依照顺序去实现所有尚没有被应用过的迁移脚本。
在执行的进程当中,工具会自行记录下哪些迁移是已经完成过的。比如说,你已然拥有了三个迁移脚本,然而仅仅应用了前面那两个,那么在运行命令之后,就仅仅会去执行第三个。如此一来,你便无需为重复执行的情况而心存担忧了。
这一过程一般是自动化的,你无需去操心具体的SQL语句。工具会替你处理好全部细节,像是添加字段时的默认值、是否准许为空等等情况。要是执行过程当中出现错误,它会告知你何处存在问题。
python manage.py migrate --fake
对于团队协作而言,此功能极具效用。每个人将最新代码拉取之后,仅仅只需运行一下迁移命令,本地的数据库结构便会自动完成更新,无需再通过手动方式去进行调整。

处于某些时候,出现了错误纠改抑或是期望回归至先前的状况,此时撤销迁移便发挥其作用了。你能够借助一条指令,去回退最近一次的迁移,工具将自行生成实施反向操作的SQL,进而把刚才所做的改动撤销掉。
然需留意,撤销之举或致数据遗失。譬若汝增添一新字段且录入若干数据于其中,撤销之际该字段将被删去,其里数据亦随之消逝。故而于生产环境行撤销之前,宜先备份数据。
要是你期望回退多个版本,那么能够指定要回退至哪一个迁移。工具会将中间所有的迁移都依据顺序撤销掉。此功能在开展排查问题工作时用途极大,比如说你怀疑某个迁移致使了性能方面的问题,就能够把它回退掉进而查看查看。
有些工具是还支持去假装执行那种撤销操作的,这意思就是仅仅去修改记录然而却不会对数据库进行改动的,这种选项呢在某些尤为特殊的场景当中是可发挥作用的 ,就好像你早就已经通过手工方式将数据库给修复好了 ,彼时只需要让工具的记录去做一下同步动作就得了。
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
绝大多部分开发框架都皆会自身携带迁移工具,像Django、Rails、Laravel这些当然都存在。自己携带的工具一般跟框架自身的模型系统配合显著良好,使用颇具便利性,无需特意另行安装。
自行携带工具所具备的益处在于,开启包装即可使用,配置过程简便。你无需去钻研如何进行集成,直接敲击命令便可以。其不足之处在于,对框架存在颇高的依赖,要是你更换框架或者打算跨语言运用,或许就无法达成了。
python manage.py makemigrations
像是Flyway、Liquibase、goose等这类第三方工具,是与框架相互独立的。无论你使用的是Java,还是Go,亦或是Python,都能够借助同一个工具去管理迁移。它们一般在功能方面更为强大,对于更为复杂的场景是予以支持的。
在多个不同语言的项目存在需求时,或者在需要对迁移过程予以精细控制的状况下,第三方工具会是更为优良的选择,虽然其学习成本会相对高一些,有些公司还会将迁移工具整合到CI/CD流水线内,达成自动化部署结果。
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app_name', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='blog',
name='author',
field=models.CharField(blank=True, max_length=100),
),
]
假定你正着手研发一个博客系统,起初博客文章仅有标题以及内容这两个字段,你运用命令生成了初始的迁移脚本,在应用该脚本之后,数据库里便存有了相应的表。
python manage.py migrate
经过了一段光阴,你认为有必要增添作者信息,于是你于模型之中添加了一个author字段。接着运行创建迁移的指令,工具会察觉到这项变化,生成一个全新的迁移脚本,其中所撰写的乃是添加author字段的行为。
你去对脚本做一下检查,在确定毫无问题之后运行应用迁移的命令,工具会将这个脚本予以执行,数据库里就会多出一个author列,现有的数据要是没有作者,能够设置一个默认值或者暂且留空。
若之后你察觉到作者字段本不该添加,欲撤销此项改动,仅需运行撤销指令,工具便会生成删除author字段的SQL并予以执行。数据库将会恢复至先前的状态,整个进程仅需寥寥数秒。
此时此刻你已然明晰了数据库迁移的基本运用方式,你平常于项目里遭遇数据库构造发生变更之际,是径直借助SQL以手动方式去修改,还是运用迁移工具来实施管理?欢迎于评论区域分享你的做法,点个赞以便让更多人得以目击这篇实用性指南。