django迁移表结构和数据

一、创建django项目和应用模块

参考本人另一篇文章前四步Python框架Django入门教程

二、编写model层

在demo模块下的models.py中添加以下代码:

python 复制代码
from django.db import models

class User(models.Model):
    class Meta:
        # 设置所需要映射的数据表,默认映射的表名是:应用名_全小写类名
        db_table = "user"
        # 约束、索引
        constraints = [
            # UniqueConstraint唯一约束;fields字段名,可以是多个字段,实现多个字段组合后的唯一性
            models.UniqueConstraint(fields=["account"], name="account_unique")
        ]

    ISDEL_CHOICES = (
        (0, "未删除"),
        (1, "已删除")
    )

    # Django自带id字段,默认类型是BigAutoField,自动递增的bigint类型字段,可手动定义
    # id = models.CharField(max_length=30, primary_key=True)
    # varchar类型字段,max_length最大长度,default默认值(仅ORM层生效,表结构没有default),verbose_name字段注释
    name = models.CharField(max_length=20, default="", verbose_name="姓名")
    account = models.CharField(max_length=20, verbose_name="账号")
    password = models.CharField(max_length=16, verbose_name="密码")
    gender = models.CharField(max_length=1, verbose_name="性别")
    # int类型字段
    age = models.IntegerField()
    # Decimal类型的字段,max_digits总长度,decimal_places小数点位数
    money = models.DecimalField(max_digits=10, decimal_places=2)
    # datetime类型字段,默认长度为6存储微秒级时间;auto_now_add=True添加数据时自动填充时间
    create_time = models.DateTimeField(auto_now_add=True)
    # datetime类型字段,默认长度为6存储微秒级时间;auto_now=True添加或更新数据时自动填充时间
    update_time = models.DateTimeField(auto_now=True)
    # null=True允许该字段为null值
    note = models.CharField(max_length=200, null=True)
    # choices限制字段的取值范围,只能是0和1,只是形式上限制,实际执行user.del=2时并不会报错,可以正常插入到数据库
    isdel = models.IntegerField(default=0, choices=ISDEL_CHOICES)

三、迁移表结构

PyCharm打开终端,执行命令:

根据demo模块中的所有model生成迁移文件,文件位置在demo/migrations/

python manage.py makemigrations demo

根据demo模块中的所有迁移文件,创建或修改表结构

python manage.py migrate demo

迁移成功后,django会自动在数据库中创建一张django_migrations表,用于跟踪迁移记录;当model层中出现变更时,可以再次执行makemigrations和migrate命令生成迁移文件并将变更应用到数据库中

四、migrate创建的表结构与model层的一些表现差异

migrate迁移命令所创建的user表结构:

CREATE TABLE `user` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(20) NOT NULL,

`account` varchar(20) NOT NULL,

`password` varchar(16) NOT NULL,

`gender` varchar(1) NOT NULL,

`age` int(11) NOT NULL,

`money` decimal(10,2) NOT NULL,

`create_time` datetime(6) NOT NULL,

`update_time` datetime(6) NOT NULL,

`note` varchar(200) DEFAULT NULL,

`isdel` int(11) NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `account_unique` (`account`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

原因:dajngo自身特性所致,model层字段的部分属性并不会直接作用在表结构上

  1. default属性,例如isdel字段的default=0,虽然表结构中并没有 DEFAULT 0,但是在使用dajngo ORM时,会自动为user.isdel赋默认值

  2. datetime类型字段,默认长度为6,存储微秒级精度的时间

五、迁移表数据

在第一次创建表后可能需要一些基础数据,例如user表中需要带有一条admin的账号

  1. 在demo模块下创建文件fixtures/user.yaml,时间字段需要手动配置,isdel则会默认填充0(不知道时间字段为啥不触发自动填充)
  • model: demo.User

fields:

id: 1

name: admin

account: admin@qq.com

password: 123456

gender: 男

age: 16

money: 0.00

create_time: 2023-01-15 00:35:00+08:00

update_time: 2023-01-15 00:35:00+08:00

  • model: demo.User

fields:

id: 2

name: 派蒙

account: paimeng@qq.com

...

  1. 执行命令,向user表中插入数据

python manage.py loaddata user.yaml

相关推荐
岁岁种桃花儿16 小时前
MySQL 8.0 基本数据类型全面解析
数据库·mysql·数据库开发
用户4270074583817 小时前
第二节:使用Mongoose连接数据库
数据库
煎蛋学姐17 小时前
SSM协同过滤的视频推荐系统s04mp(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·用户管理·协同过滤·ssm 框架·视频推荐系统
马克学长17 小时前
SSM薪酬管理系统b26z4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·薪酬管理系统
龙腾AI白云17 小时前
AI智能体搭建(3)深度搜索智能体如何搭建与设计 Agent#智能体搭建#多智能体#VLA#大模型
python·django·virtualenv·scikit-learn·tornado
胡萝卜的兔17 小时前
ThinkPHP6.0 Redis 延迟队列 + 定时任务 实现超时取消订单完整部署脚本
数据库·redis·缓存
2501_9445210018 小时前
rn_for_openharmony商城项目app实战-主题设置实现
javascript·数据库·react native·react.js·ecmascript
heartbeat..18 小时前
SQL 常用函数大全:聚合、字符串、数值、日期、窗口函数解析
java·数据库·sql·函数
chuxinweihui18 小时前
MySQL数据库基础
数据库·mysql
无敌的牛19 小时前
MySQL基础
数据库·mysql