记录,Django如何利用已经存在的数据库中的表反向生成对应的Model

2021-04-30 14:40:37 浏览数 (1)

Django框架中,model模型文件是操作联系数据库的桥梁,通过对于模型文件的编写可以不关心数据库,直接操作本身即可,不过关于模型层model文件的编写,需要通过大量的事件才能掌握,本渣渣一直不得要领,好在有另一种方法,可以实现model模型文件的反向生成。

这就是下面本渣渣的记录,Django如何利用已经存在的数据库中的表反向生成对应的Model,直接用现成的数据库,数据库文件表来生成对应的model。

Navicat for MySQL

而现成的数据库的表文件,可以通过数据库操作工具,比如Navicat for MySQL,推荐使用它来创建表文件,非常简单既能完成一个数据表文件的设置。

Navicat for MySQL 是管理和开发 MySQL 或 MariaDB 的理想解决方案。它是一套单一的应用程序,能同时连接 MySQL 和 MariaDB 数据库,并与 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure、阿里云、腾讯云和华为云等云数据库兼容。这套全面的前端工具为数据库管理、开发和维护提供了一款直观而强大的图形界面。

mysqlclient

操作需要安装第三方库:mysqlclient

我们想要用Django来操作MySQL,首先还是需要安装一个驱动程序。在Python3中,驱动程序有多种选择。比如有pymysql以及mysqlclient等。

mysqlclient安装非常简单,只需要通过pip install mysqlclient即可安装。

以下为操作记录,仅供参考!

  • 步骤一:更改为mysql数据库

django框架默认项目数据库引擎为sqlite3,这里我们需要在setting.py更改为mysql,这里本渣渣链接的是本地的mysql!

原代码:

代码语言:javascript复制
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

新代码:

代码语言:javascript复制
DATABASES={
    'default':{
        'ENGINE':'django.db.backends.mysql',
        'NAME':'cs',
        'USER':'cs',
        'HOST':'127.0.0.1',
        'PASSWORD':'123456',
        'PORT':'3306',
    }
}
  • 步骤二:安装操作数据库的第三方库:mysqlclient
代码语言:javascript复制
pip install mysqlclient
  • 步骤三:使用根据数据库表反向生成Model的命令(关键)

使用这条命令,会根据设置的数据库中的表在自动生成对应的Model代码,并打印出来

代码语言:javascript复制
python manage.py inspectdb

具体用法

  • 指定数据库

直接将打印的代码直接导入到指定的Model文件中

代码语言:javascript复制
#直接将打印的代码直接导入到指定的Model文件中
python manage.py inspectdb > [your app name]models.py

前提是创建了app(my_mysql_web_app)并且在setting.py文件中注册过

  • 指定数据库表
代码语言:javascript复制

#将指定的表生成对应的Model
python manage.py inspectdb --database default stu
python manage.py inspectdb --database default stu > my_mysql_web_app/models.py
python manage.py inspectdb stu > my_mysql_web_app/models.py
实例演示:

这里本渣渣就以 Stu表为实例演示一下根据数据库表反向生成Model

python manage.py inspectdb 命令

代码语言:javascript复制
class Stu(models.Model):
    sid = models.CharField(max_length=6, blank=True, null=True)
    sname = models.CharField(max_length=50, blank=True, null=True)
    age = models.IntegerField(blank=True, null=True)
    gender = models.CharField(max_length=50, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'stu'

python manage.py inspectdb --database default Stu > blogmodels.py 命令

生成model代码效果:

代码语言:javascript复制
# 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 Stu(models.Model):
    sid = models.CharField(max_length=6, blank=True, null=True)
    sname = models.CharField(max_length=50, blank=True, null=True)
    age = models.IntegerField(blank=True, null=True)
    gender = models.CharField(max_length=50, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Stu'

模型文件代码生成效果:

问题汇总

问题一:在执行makemigrationbs提示no changed错误,或者是migrate提示no migrations。解决:删除数据库中表django_migrations中有关自己app的条目,并且删除工程目录下,app目录下migration文件夹中除了__init__.py之外的所有文件。再重新执行迁移。

问题二:为什么要在inspectdb之后更换数据库再进行迁移,直接使用原来的数据库不可以吗?回答:因为作者发现inspecdb之后,自定义修改生成的models.py文件(例如新增字段之类),执行迁移之后并不会改变原数据库中的表结构。

·················END·················

你好,我是二大爷,

革命老区外出进城务工人员,

互联网非早期非专业站长,

喜好python,写作,阅读,英语

不入流程序,自媒体,seo . . .

公众号不挣钱,交个网友。

读者交流群已建立,找到我备注 “交流”,即可获得加入我们~

听说点 “在看” 的都变得更好看呐~

关注关注二大爷呗~给你分享python,写作,阅读的内容噢~

扫一扫下方二维码即可关注我噢~

0 人点赞