Django连接数据(学习记录)

0.说在前面

0.1 Django ORM

Django 模型使用自带的 ORM。

对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

img

使用 ORM 的好处:

  • 提高开发效率。
  • 不同数据库可以平滑切换。

使用 ORM 的缺点:

  • ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
  • 长期写 ORM 代码,会降低编写 SQL 语句的能力。

ORM 解析过程:

  • 1、ORM 会将 Python 代码转成为 SQL 语句。
  • 2、SQL 语句通过 pymysql 传送到数据库服务端。
  • 3、在数据库中执行 SQL 语句并将结果返回。

ORM 对应关系表:img

1.连接数据库

1.1 直接下载MySQL(5.7版本以上)

将端口Port设置为3306,管理员Management User为root,密码Password为123456。

运行以下命令启动MySQL服务。

net start mysql
1.2 通过Docker安装MySQL

Windows Terminal运行以下命令:

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

在Docker container 启动 MySQL服务。

1.3 Django项目连接MySQL数据库
1.3.1 安装MySQLClient
pip install mysqlclient
1.3.2 配置settings文件

打开settings.py项目配置文件

找到DATABASES配置项,并按以下修改:

# settings.py

DATABASES = {
    'default': {
        # 连接本地mysql数据库
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql',  # 你的数据库名
        'USER': 'root',  # 你的用户名
        'PASSWORD': '123456',  # 你的密码
        'HOST': 'localhost',  # 本地连接
        'PORT': '3306',  # 本地端口号

    }
}

2. 建表并进行简单的增删改操作

2.1 建立表格

打开APP下的models.py文件

假设要创建一个评价模块,其中:

需要编码,模块名称,分值

models.py

class Evaluation(models.Model):
    id = models.AutoField(primary_key=True, verbose_name="编码")
    name = models.CharField(verbose_name="模块名称", max_length=32)
    score = models.PositiveIntegerField(verbose_name="分值", max_length=2)    # 正整数

在终端运行以下命令:

python manage.py makemigrations
python manage.py migrate

可以看到数据库内以及建好一个名为app01_evalution的表,表的结构如下图所示:

image-20220921212211849

2.2 数据增删改

先于urls.py 文件的urlpatterns添加以下代码:

# urls.py

urlpatterns = [
    ...,
    path('test/add/', views.test_add),
    path('test/edit/', views.test_edit),
    path('test/delete/', views.test_delete),
    path('test/list/', views.test_list),
]
2.2.1 新增数据

新增如下数据

ID模板名称分值
1模块1:选择题目20
2模块2:掌握情况10
3Need_TO_DELETE0

于views.py 添加:

from django.shortcuts import render,redirect,HttpResponse
from app01 import models

def test_add(request):
    """添加评价"""
    names = ['模块1:选择题目', '模块2:掌握情况', 'Need_TO_DELETE']
    scores = [20, 10, 0]
    for i in range(3):
        models.Evaluation.objects.create(name=names[i], score=scores[i])
    return HttpResponse('添加成功')

浏览器访问 http://localhost:8888/test/add/

可观察到已经有新增的数据:

image-20220921215756701

2.2.2 修改数据

将id为3的数据的score 改为 5

# views.py

def test_edit(request):
    """修改评价"""
    models.Evaluation.objects.filter(id=3).update(score=5)
    return HttpResponse('修改成功')

浏览器访问http://localhost:8888/test/edit/

image-20220921220530673

2.2.3 删除数据

删除id为3的数据

# views.py

def test_delete(request):
    """删除评价"""
    models.Evaluation.objects.filter(id=3).delete()
    return HttpResponse('删除成功')

浏览器访问http://localhost:8888/test/delete/

image-20220921220729930

2.2.4 展示所有数据

在Python中输出表中的数据并展示在页面上

def test_list(request):
    datas = models.Evaluation.objects.all()
    for data in datas:
        print(data.id, data.name, data.score)
    return render(request, 'test.html', {'datas': datas})

在test.html的nav标签下新增以下代码:

<div class="card">
        <div class="card-header">
            评价模块
        </div>
        <div class="card-body">
            <table class="table table-bordered table-striped">
                <thead>
                <tr>
                    <th scope="col">编码</th>
                    <th scope="col">模块名称</th>
                    <th scope="col">分值</th>
                    <th scope="col">操作</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in datas %}
                    <tr>
                        <th scope="row">{{ obj.id }}</th>
                        <td>{{ obj.name }}</td>
                        <td>{{ obj.score }}</td>
                    <td>
                        <a href="#" class="btn btn-primary btn-sm">编辑</a>
                        <a href="#" class="btn btn-danger btn-sm">删除</a>
                    </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>

        </div>
    </div>

python控制台输出结果为:

image.png

浏览器返回如下:

image-20220921222920070
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值