Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。

简介: 这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。

前言

  • 上接博文:Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
  • 紧跟上一篇博文,本文主要基于上一篇项目的内容,配置mysql,创建model实例,自动创建数据库表,进行操作model,并进行反思(不采用自动创建表,如何操作mysql的表)
  • 有兴趣可以添加我,一起探讨技术。
    • 加V:Fengfl1222,名称:insist科技。
    • 要资料,申请备注为:CSDN+地方,如CSDN山东。
    • 想接项目一起努力进步,申请备注为:CSDN+地方+项目,如CSDN+山东+项目,添加成功之后,可以发一份简历。
    • 本人介绍:211高校(北京交通大学)计算机研究生,本科双非计算机毕业后,校招进入军工,工作2个月离职后进入阿里,工作两年后离职考研,现已毕业,入职济南某大厂。主要技术栈:java、python、vue、react等web开发需求。已有开发团队,如果有空闲时间想一个接项目者,可以加我呦。
    • 不按上诉规则添加好友者,不予通过。
  • 项目环境
    • python: 3.11.5
    • django:4.1
      在这里插入图片描述

一、项目初始化搭建

1、创建项目:test_models_django

详细创建请看博文一:Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld

对前面的搭建流程梳理简化。

  1. django-admin startproject test_models_django:创建项目test_models_django
  2. cd test_models_django
  3. python manage.py migrate
    在这里插入图片描述
  4. python manage.py runserver:运行项目
    在这里插入图片描述
  5. 浏览器输入网址:http://127.0.0.1:8000/,结果如下,Django项目搭建成功
    在这里插入图片描述
  6. 使用pycharm打开如下。配置环境啥的请看博文一。

2、创建应用app01

  1. python manage.py startapp app01:创建应用app01

  2. 主包中配置应用app01,如下所示:
    在这里插入图片描述

  3. app01中的urls.pyviews.py。(没有则新建)
    在这里插入图片描述
    在这里插入图片描述

  4. 主包中的urls.py
    在这里插入图片描述

  5. 浏览器输入网址:http://127.0.0.1:8000/hello,结果如下,应用搭建成功
    在这里插入图片描述

二、配置mysql

主包中settings.py
默认的数据库配置如下。

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

修改后如下所示

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "数据库名",
        "USER": "用户",
        "PASSWORD": "密码",
        "HOST": "ip",
        "PORT": "3306"
    }
}

保存后,系统报错,缺少mysql插件,需要安装mysqlclient
在这里插入图片描述
执行以下命令安装

pip install mysqlclient

或者使用conda来安装

conda install mysqlclient

python manage.py runserver:然后成功运行。
在这里插入图片描述

三、创建model实例,自动创建数据库表

1、创建对象User类

  1. app01包中model.py,添加用户类User
  2. 子类Meta中定义表的元数据,我这里指定了表的名称为 f_user_01
from django.db import models

# Create your models here.
class User_01(models.Model):
    u_id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=64, null=True)
    name = models.CharField(max_length=64, null=True)
    password = models.CharField(max_length=64, null=True)
    sex = models.CharField(max_length=64, null=True)
    age = models.CharField(max_length=64, null=True)
    phone = models.CharField(max_length=64, null=True)
    email = models.CharField(max_length=64, null=True)
    unit = models.CharField(max_length=64, null=True)
    avatar = models.CharField(max_length=64, null=True)
    status = models.CharField(max_length=64, null=True)
    create_time = models.CharField(max_length=64, null=True)
    delete_time = models.CharField(max_length=64, null=True)
    update_time = models.CharField(max_length=64, null=True)

    class Meta:
        db_table = "f_user_01"

在这里插入图片描述

2、执行命令

# 生成迁移数据
python manage.py makemigrations
# 生成数据库表
python manage.py migrate
  • 执行完第一个命令,会在当前包app01中生成初始化文件,仅仅对我们的类做了一个解读。
    在这里插入图片描述
    在这里插入图片描述

  • 执行完第二个命令,会在数据库中生成数据库表。
    在这里插入图片描述

  • 数据库表生成如下所示,只有f_user_01是我们要生成的表,上面的其他表都是Django系统默认生成的表。暂且不管。(未圈中的与本项目无关)
    在这里插入图片描述

四、思考问题(****)

  • 其实大多数时候,都是自己创建表,不需要自动创建表,那么从models.py中创建了对象类,应该怎么和自己创建的数据库表对应呢。
  • 或者说,是否可以直接通过model.py不创建新表,直接操作数据库中对应的表呢。
  • 那就实验一下吧,自己手动创建数据库表,然后手动创建models.py,在执行迁移命令,看是否还会生成新的表呢。

1、是否会生成新表呢(答案报错)

数据库创建表 f_user。具体如下所示。(如上面截图所示,我这里已经创建好了)
在这里插入图片描述
models.py添加User类,与数据库表中字段一一对应。 和f_user_01表一样,唯一的不一样就说最后的时间类型改为DateTime。数据库也修改成相应的了。

class User(models.Model):
    u_id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=64, null=True)
    name = models.CharField(max_length=64, null=True)
    password = models.CharField(max_length=64, null=True)
    sex = models.CharField(max_length=64, null=True)
    age = models.CharField(max_length=64, null=True)
    phone = models.CharField(max_length=64, null=True)
    email = models.CharField(max_length=64, null=True)
    unit = models.CharField(max_length=64, null=True)
    avatar = models.CharField(max_length=64, null=True)
    status = models.CharField(max_length=64, null=True)
    create_time = models.CharField(max_length=64, null=True)
    delete_time = models.CharField(max_length=64, null=True)
    update_time = models.CharField(max_length=64, null=True)

    class Meta:
        db_table = "f_user"

在这里插入图片描述
执行命令如下,看是否会报错等其他情况。

# 生成迁移数据
python manage.py makemigrations
# 生成数据库表
python manage.py migrate

执行第一个命令后,migrations中生成了一个新的映射迁移。新的类,生成了一个新的模型类。
在这里插入图片描述
在这里插入图片描述
执行第二个命令后,报错,如下:(说明表已经存在)
在这里插入图片描述

2、总结

models.py中指定了表名,如果数据库表中没有则创建,有则报错。
接下来对这两个表进行添加操作。

五、f_user_01和f_user的添加操作

1、f_user_01中的添加操作(自动生成的表)

a、views.py

from django.http import HttpResponse
from app01 import models
import json

def hello_world(request):
    return HttpResponse("app01 Hello, World!")

def addUser01(request):
    models.User_01.objects.create(username='admin', name='冯坚持', password='123456', sex='男', age='18',
                                  phone='1234567890', email='123456789@163.com', unit='1-1-1', avatar='asdad',
                                  status='1', create_time='20240104 12:12:22', delete_time='20240104 12:12:22',
                                  update_time='20240104 12:12:22')
    result = {
        'code': 0,
        'msg': 'success',
        'data': ''
    }
    return HttpResponse(json.dumps(result, ensure_ascii=False), content_type='application/json')

在这里插入图片描述

b、urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.hello_world),
    path('addUser01/', views.addUser01),
]

在这里插入图片描述

c、测试

  1. 浏览器输入:http://127.0.0.1:8000/addUser01/
    在这里插入图片描述
  2. 查看mysql数据库,数据插入成功
    在这里插入图片描述

2、f_user中的添加操作(手动在mysql创建的表)

a、views.py

from django.http import HttpResponse
from app01 import models
import json
from django.utils import timezone
from datetime import datetime

def addUser(request):
    print(timezone.now())  # 使用 timezone.now() 获取当前时间
    print(datetime(2023, 6, 6, 12, 0, 0))  # 手动设置 datetime 值,可以使用 Python 的 datetime 模块
    models.User.objects.create(username='admin', name='冯坚持', password='123456', sex='男', age='18',
                               phone='1234567890', email='123456789@163.com', unit='1-1-1', avatar='asdad',
                               status='1', create_time=timezone.now(), delete_time=timezone.now(),
                               update_time=timezone.now())
    result = {
        'code': 0,
        'msg': 'success',
        'data': ''
    }
    return HttpResponse(json.dumps(result, ensure_ascii=False), content_type='application/json')

在这里插入图片描述

b、urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.hello_world),
    path('addUser01/', views.addUser01),
    path('addUser/', views.addUser),
]

在这里插入图片描述

c、测试

  1. 浏览器输入:http://127.0.0.1:8000/addUser/
    在这里插入图片描述
  2. 查看mysql数据库,数据插入成功
    在这里插入图片描述

d、print输出

在这里插入图片描述

3、发现问题

a、问题

在运行界面,发现如下提示。
在这里插入图片描述

b、原因

意思是有一个没有应用的迁移类,因为在第四章,执行了命令python manage.py makemigrations,所以在migrations中生成了对应迁移类User,但是其表f_user在数据库中已经存在了,所以,在执行第二个命令python manage.py migrate 报错了,提示表已经存在。
这就是出现上面警告的原因。
在这里插入图片描述

c、解决

对于数据库中已经存在的表,只在models.py中声明即可,不用执行迁移的两个命令。现在目前的情况,删除0002__user.py即可。
在这里插入图片描述

d、删除之后再运行

在这里插入图片描述
在执行f_user表的添加请求测试如下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、总结

  1. 配置mysql,需要安装mysqlclient,编写models的实体类,通过迁移命令可以自动生成mysql数据库表结构。
  2. 如果数据库表中已经创建好表,则只在model.py中创建对应实体类即可,不用执行迁移的两个命令。(这里就和java对应上了,直接编写对应实体类和sql即可)
  3. 如果数据库没有创建好表,可以在models设计号实体类,使用迁移命令即可自动生成mysql数据库表结构。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
10月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
数据管理 数据库 数据安全/隐私保护
Django—同一项目不同app使用不同数据库
在Django项目中实现不同app使用不同数据库的配置,可以通过配置多数据库、创建数据库路由和配置路由来实现。通过这种方法,可以有效地将数据隔离到不同的数据库,提高数据管理的灵活性和系统的可扩展性。希望本文能为开发者在Django项目中使用多数据库提供清晰的指导。
519 4
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
638 15
|
SQL NoSQL 关系型数据库
数据库学习
【10月更文挑战第8天】
293 1
|
SQL Java 数据库
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
这篇文章是关于如何使用Django框架的ORM系统在视图(views)层面进行数据库的增、删、改、查操作的教程。
199 0
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
|
JavaScript 前端开发 关系型数据库

推荐镜像

更多