Django学习二:配置mysql,创建model实例,自动创建数据库表,对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

默认的数据库配置如下。

python 复制代码
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

修改后如下所示

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

保存后,系统报错,缺少mysql插件,需要安装mysqlclient

执行以下命令安装

bash 复制代码
pip install mysqlclient

或者使用conda来安装

bash 复制代码
conda install mysqlclient

python manage.py runserver:然后成功运行。

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

1、创建对象User类

  1. app01包中model.py,添加用户类User
  2. 子类Meta中定义表的元数据,我这里指定了表的名称为 f_user_01
python 复制代码
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、执行命令

bash 复制代码
# 生成迁移数据
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。数据库也修改成相应的了。

python 复制代码
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"

执行命令如下,看是否会报错等其他情况。

bash 复制代码
# 生成迁移数据
python manage.py makemigrations
# 生成数据库表
python manage.py migrate 

执行第一个命令后,migrations中生成了一个新的映射迁移。新的类,生成了一个新的模型类。

执行第二个命令后,报错,如下:(说明表已经存在)

2、总结

models.py中指定了表名,如果数据库表中没有则创建,有则报错。

接下来对这两个表进行添加操作。

五、f_user_01和f_user的添加操作

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

a、views.py

python 复制代码
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

python 复制代码
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

python 复制代码
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

python 复制代码
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数据库表结构。
相关推荐
数智化管理手记5 小时前
精益生产中的TPM管理是什么?一文破解设备零故障的密码
服务器·网络·数据库·低代码·制造·源代码管理·精益工程
Xudde.5 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
翊谦5 小时前
Java Agent开发 Milvus 向量数据库安装
java·数据库·milvus
晓晓hh5 小时前
JavaSE学习——迭代器
java·开发语言·学习
難釋懷6 小时前
OpenResty实现Redis查询
数据库·redis·openresty
421!6 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
别抢我的锅包肉6 小时前
【MySQL】第四节 - 多表查询、多表关系全解析
数据库·mysql·datagrip
Database_Cool_6 小时前
OpenClaw-Observability:基于 DuckDB 构建 OpenClaw 的全链路可观测体系
数据库·阿里云·ai
AI成长日志6 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
刘~浪地球7 小时前
Redis 从入门到精通(五):哈希操作详解
数据库·redis·哈希算法