【Django 005】利用ORM和sqlite数据库交互

平常我们都是用SQL语句来操作关系型数据库,但是如果在python中插入一堆SQL语句实在是太繁琐。如果能把SQL操作封装成一个个的方法,利用面向对象的思想来操作该多好。前辈们早就已经想到了,于是才有了我们MTV模型中的M,也就是models。这一节我们就一起来看看如何在Django中操作Sqlite。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

ORM

ORM(Object Relational Mapping),对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。ORM在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。让软件开发人员专注于业务逻辑的处理,提高了开发效率。

利用models添加表

Django中通过MTV模型中的models来定义一个数据库的表,ORM会帮我们自动翻译为SQL中的DDL(Data Definition Language)。

还是以上一节的项目为例,在Two/models.py中添加如下内容,这里用类定义了一个模型,对应到数据库中的一个表Student,待会每个该类的实例都是表中的一条记录。这里还定义了表中的两个字段:

from django.db import models

# Create your models here.
class Student(models.Model):
    s_name = models.CharField(max_length=16)
    s_age = models.IntegerField(default=1)

然后创建一个迁移。这个操作将在Two/migrations创建一个文件:

(django) [fuhx@testmachine HelloDjango]$ python manage.py makemigrations
Migrations for 'Two':
  Two/migrations/0001_initial.py
    - Create model Student
(django) [fuhx@testmachine HelloDjango]$

我们打开这个文件Two/migrations/0001_initial.py看一下

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Student',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('s_name', models.CharField(max_length=16)),
                ('s_age', models.IntegerField(default=1)),
            ],
        ),
    ]

这里可以看出,除了我们刚才创建的两个字段外,Django还帮我们自动创建了一个叫id的字段,而且是主键。

以后如果想把相同的表创建到别的数据库,例如mysql,可以直接在这个基础上操作,不用重复创建迁移了

然后我们做一个迁移,将刚才的表真正放到数据库中

(django) [fuhx@testmachine HelloDjango]$ python manage.py migrate
Operations to perform:
  Apply all migrations: Two, admin, auth, contenttypes, sessions
Running migrations:
  Applying Two.0001_initial... OK
(django) [fuhx@testmachine HelloDjango]$

成功以后我们去数据库里面刷新一下就看到了新添加的表
1-student.png

对数据库的操作必须要刷新才可以看得到

双击刚才创建的表就能看到它的结构,如下。可以直接在界面上进行添加和删除记录,也可以查看其DDL
2-table.png
DDL如下,如果字段过多可以看到每个字段的定义

create table Two_student
(
    id     integer     not null
        primary key autoincrement,
    s_name varchar(16) not null,
    s_age  integer     not null
);

图形界面操作数据

下面我点击加号添加一行数据,注意这个主键id是不能手动输入的
3-add.png
需要点击同步按钮才能同步到数据库中,同步后如下,自动帮我们将主键设置为了1
4-success.png
如果要修改数据,直接双击修改然后同步到数据库即可。而要删除某一行选中该行然后点减号再同步到数据库。但是要注意的是,被删除的记录对应的主键id也是不会被重复利用的,例如删除了id为2的记录,再添加的时候id就是3。

ORM操作数据

ORM添加记录

归根结底我们还是希望直接用view函数去操作数据库,首先添加一个添加记录的路由如下

path('addstudent/', views.addstudent)

然后添加view函数如下

from Two.models import Student

def addstudent(request):
    student = Student()
    student.s_name = 'james'
    student.s_age = 3
    student.save()
    return HttpResponse('Add student successfully!')

重点来了!!

这里实例化了一个Student类,也就是表中的一条记录。然后对这条记录的两个字段分别赋值,最后保存一下。

刷新一下,成功在数据库看到了添加的记录,但是因为我之前删除过两条记录,这里的id为4
5-new.png

这样就将复杂的SQL用简单的面向对象语句实现了。

以后还可以从前端接受内容,然后用类似的方法放到数据库里面去。

ORM显示数据

创建路由规则如下

path('showstudents/', views.showstudents)

创建view函数如下

def showstudents(request):
    students = Student.objects.all()
    for student in students:
        print(student.s_name+' '+str(student.s_age))
    return HttpResponse('Check successfully!')

重点又来了!!

这里使用了Student.objects,这是ORM给我们提供的一个操作这个Student表的一个入口,all方法返回所有的记录。这时访问http://127.0.0.1:8000/two/showstudents/会在terminal打印出如下结果

xiaofu 13
james 3
kobe 40
davis 25

这里的objects后面还会详细讲,这里会使用即可

如果想在html中展示结果可以利用到上一节的jinja模板语法,注意这里传入context的一定是一个字典。修改view函数如下

def showstudents(request):
    students = Student.objects.all()
    context = {
        'students':students,
    }
    return render(request,'students.html',context=context)

创建一个模板文件students.html如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>students</title>
</head>
<body>
<h1>Studens</h1>
<table>
    <tr>
        <th>Name</th>
        <th>Age</th>
    </tr>
    {% for student in students %}
        <tr>
            <td>{{ student.s_name }}</td>
            <td>{{ student.s_age }}</td>
        </tr>
    {% endfor %}

</table>
</body>
</html>

补充快速构建表格的快捷键 table>tr>th 以及 tr>td*2,之后按Tab即可

再次访问之后的结果如下
6-list.png

ORM修改数据

数据的修改和删除都是建立在查询的基础之上的,首先获得想要修改的记录,然后进行操作再保存。

首先创建路由如下

path('updatestudent/', views.updatestudent)

然后创建view函数如下

def updatestudent(request):
    student = Student.objects.get(s_name='kobe')
    student.s_age=41
    student.save()
    return HttpResponse('Update successfully!')

这里同样也是利用了Student.objects入口,利用get(字段名=值)获取记录对象,然后修改字段的值,再保存。

之后访问http://127.0.0.1:8000/two/updatestudent/,再访问http://127.0.0.1:8000/two/showstudents/显示的内容如下,可以看到kobe的年龄已经变成了41
7-41.png

ORM删除数据

和修改数据一样,也是首先获得数据,再删除。

创建路由规则如下

path('deletestudent/', views.deletestudent)

创建view函数如下,将kobe记录删除了

def deletestudent(request):
    student = Student.objects.get(s_name='kobe')
    student.delete()
    return HttpResponse('Delete successfully!')

之后访问http://127.0.0.1:8000/two/deletestudent/,再访问http://127.0.0.1:8000/two/showstudents/显示的内容如下,可以看到kobe记录已经被删除了
8-delete.png

总结

这一节我们一起看了Django的MTV模型中的M,实现了对sqlite数据库的增删改查。但是我们都知道sqlite这种轻量级的数据库在生产环境是很少使用的,下一节我们就来看看sqlite的大哥mysql,看看如何用Django去连接并且操作mysql。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值