Django 之 inspectdb
inspectdb简单介绍
- 具体用法,在Django项目下
python manage.py inspecdb > [your app name]\models.py
- 作用
众所周知,Django较为适合原生开发,即通过该框架搭建一个全新的项目,通过在修改models.py来创建新的数据库表。但是往往有时候,我们需要利用到之前的已经设计好的数据库,数据库中提供了设计好的多种表单。那么这时如果我们再通过models.py再来设计就会浪费很多的时间。所幸Django为我们提供了inspecdb的方法。他的作用即使根据已经存在对的mysql数据库表来反向映射结构到models.py中.
inspectdb使用步骤
- 通过配置settings文件以及__init__.py来连接到本地的mysql数据库。(之前的博客有谈到方法)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'second_shop',
'USER':'root',
'PASSWORD':'123',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
- 在terminal中执行语句
python manage.py inspectdb > [your app name]\models.py
- 查看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
# * 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.
#
# Also note: You'll have to insert the output of 'django-admin sqlcustom [app_label]'
# into your database.
from __future__ import unicode_literals
from django.db import models
class Good(models.Model):
good_name = models.CharField(max_length=255, blank=True, null=True)
good_price = models.DecimalField(max_digits=10, decimal_places=0, blank=True, null=True)
good_days = models.IntegerField(max_length=10, blank=True)
good_id = models.CharField(max_length=18, blank=True)
class Meta:
managed = False
# False表示在迁移时候不新建此表,所以这里应该改为TRUE
db_table = 'good'
- 新建一个mysql数据库,并且重新配置settings文件连接到新的数据库。
- 执行迁移,将之前获得的表结构迁移到新数据库中。
python manage.py makemigrations
python manage.py migrate
- 查看新建的数据库,发现导出成功。
- 通过给models.py新加字段查看能否成功在mysql中表示。
class Good(models.Model):
good_name = models.CharField(max_length=255, blank=True, null=True)
good_price = models.DecimalField(max_digits=10, decimal_places=0, blank=True, null=True)
good_days = models.IntegerField(max_length=10, blank=True)
good_id = models.CharField(max_length=18, blank=True)
good_place = models.CharField(max_length=50, blank=True) # 新增列
class Meta:
managed = False
db_table = 'good'
python manage.py makemigrations
python manage.py migrate
8. 查看Navicat中数据库。
9. 只有如果原来数据库中有原始数据,则可以通过mysql方法直接导入。
问题汇总
问题一: 在执行makemigrationbs提示no changed错误,或者是migrate提示no migrations。
解决: 删除数据库中表django_migrations中有关自己app的条目,并且删除工程目录下,app目录下migration文件夹中除了__init__.py之外的所有文件。再重新执行迁移。
问题二: 为什么要在inspectdb之后更换数据库再进行迁移,直接使用原来的数据库不可以吗?
回答: 因为作者发现inspecdb之后,自定义修改生成的models.py文件(例如新增字段之类),执行迁移之后并不会改变原数据库中的表结构。