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
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文件中注册过
- 指定数据库表
#将指定的表生成对应的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,写作,阅读的内容噢~
扫一扫下方二维码即可关注我噢~