Django从已存在的Mysql数据库表开始项目

Django 的ORM自带的migrate指令很适合从零启动一个项目,并让django自动跟踪model class的变动,可以实现完全脱离手动SQL操作构建项目。
但更多时候,我们的项目都会从现有的数据库着手开发,Django也有对应的命令方便我们执行迁移。

1. 设置setting中的database信息

# setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '<你的mysql数据库名>',
        'USER': '',
        'PASSWORD': '',
        'HOST': '127.0.0.1',
        'PORT': 3306
    }
}

2. 从mysql现存的一个database开始

数据库名为django_test,只存在一张表。在django中,一张表对应model中的一个类。

CREATE TABLE `actor` (
  `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(45) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  `last_update` timestamp NOT NULL,
  PRIMARY KEY (`actor_id`),
) 

在Navicat中结构如下:
Django从已存在的Mysql数据库表开始项目_第1张图片

3. 反向生成models.py

可以先执行以下inspectdb,django通过setting当中的database配置信息找到数据库表,并输出对应的models.py

python .\manage.py inspectdb

仅输出到终端窗口,此操作不生成models.py内容

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey has `on_delete` set to the desired behavior.
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models


class Actor(models.Model):
    actor_id = models.PositiveSmallIntegerField(primary_key=True)
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    last_update = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'actor'

检查无误后,再执行

python manage.py inspectdb > models.py

输出上述内容到当前文件夹的models.py文件中。

Tips:值得一提的managed=False

从输出的models.py可以看到,由inspectdb创建的model有
managed = False,这意味着django不对该表进行创建、修改和删除。

managed属性默认为True,即从python manage.py migrate中创建的model,由django负责它的改动,django通过以下操作维护数据库表:
1. migrate表记录model中类的改动变化;
2. 执行makemigrations和migrate将改动应用到数据库表。

可以理解为django的默认模式是接管从model类到数据库的映射过程,使开发者更加便利。而inspectdb则是从数据库映射到model类,在开发的场景中,如果是接入一个外部数据表,如第三方开发的数据库供查询,那这种情况下,很可能django并不负责维护这个数据库,只实现ReadOnly功能。数据库内容的增删改由另一套程序负责。
因此,如果django不负责维护改数据库,或者说model中的改动不需要更新到数据库,那么我们保持managed = False
但如果我们django是接手了一个遗留数据库,后续的数据库改动都由django完成,那么我们可以设置 managed = True 或者直接把该行删除,django对managed会应用默认值True。

你可能感兴趣的:(python学习笔记,django)