【Django基础学习】python manage.py inspectdb相关的一些问题和解决方案

Django 之 inspectdb

inspectdb简单介绍

  1. 具体用法,在Django项目下
python manage.py inspecdb > [your app name]\models.py
  1. 作用
    众所周知,Django较为适合原生开发,即通过该框架搭建一个全新的项目,通过在修改models.py来创建新的数据库表。但是往往有时候,我们需要利用到之前的已经设计好的数据库,数据库中提供了设计好的多种表单。那么这时如果我们再通过models.py再来设计就会浪费很多的时间。所幸Django为我们提供了inspecdb的方法。他的作用即使根据已经存在对的mysql数据库表来反向映射结构到models.py中.

inspectdb使用步骤

  1. 通过配置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',
    }
}
  1. 在terminal中执行语句
python manage.py inspectdb > [your app name]\models.py
  1. 查看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'
  1. 新建一个mysql数据库,并且重新配置settings文件连接到新的数据库。
  2. 执行迁移,将之前获得的表结构迁移到新数据库中。
python manage.py makemigrations
python manage.py migrate
  1. 查看新建的数据库,发现导出成功。
    已经成功导出
  2. 通过给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文件(例如新增字段之类),执行迁移之后并不会改变原数据库中的表结构。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值