ORM系统的分析
1.ORM概念:对象关系映射(Object Relational Mapping,简称ORM)
2.ORM的优势:不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。
Django的映射关系
- 模型类必须都写在app下的models.py文件中。
- 模型如果需要映射到数据库,所在的app必须被安装(注册).
- 一个数据表对应一个模型类,表中的字段,对应模型中的类属性。
数据库的配置
- 须在项目的settings.py文件中进行数据库的配置,需要将引擎换成mysql,同时需要在虚拟机中进行端口转发,将3306转3306。具体代码如下:
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
'ENGINE':'django.db.backends.mysql', #数据库引擎
'NAME': 'dj27', #指定数据库
'USER': 'admin',
'PASSWORD':'qwe123',
'HOST':'127.0.0.1', #本案例操作的是虚拟机ip
'PORT': 3306, #需要操作的数据库的端口
}
}
- 也可以自己创建一个用户,创建一个管理员用户xxx账号,密码为 qwe123:
CREATE USER ‘xxx’@‘%‘IDENTIFIED BY ‘qwe123’;
给这个用户授予所有远程访问,这个用户主要用于管理整个数据库,备份,还原等操作。
GRANT ALL ON . TO ‘xxx’@‘%’;
使授权立即生效:
FLUSH PRIVILEGES;
3.考虑到需要用pymysql操作数据库,进入到虚拟机的终端交互界面进行下载(pip install pymysql),并在主目录文件中的__init__.py文件中进行导入。
import pymysql
pymysql.install_as_MySQLdb() #配置pymysql管理器
Django模型类的使用
- 在app下面的models.py中创建django的模型类。
from django.db import models
# Create your models here.
class User(models.Model): #模型类
id = models.AutoField(primary_key=Ture) #主键,自增长,ID可以省略不写
name = models.CharField(20) #字符串字段
age = models.IntegerField() #整数字段
- 将模型类映射到数据库中,先执行 makemigrations model_test生成映射文件,然后执行migrate model_test提交到数据库,在虚拟机中查看映射成功的表格如下:
mysql> show tables
-> ;
+-------------------+
| Tables_in_dj27 |
+-------------------+
| django_migrations |
| model_test_user |
+-------------------+
2 rows in set (0.00 sec)
mysql> desc model_test_user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| age | int | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)
注意:如果想删除创建的表格,不要直接在虚拟机中进行删除,容易报错。而是将models.py中的模型类全部注释,然后重新重复上述步骤进行映射。
2. 对数据库进行增删改查的操作,为了更直观地进行前后端交互展示,首先编写了一个登录注册界面,如下所示
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="{% url 'add_user' %}" method="post">
{% csrf_token %}
用户名: <input type="text" NAME="username">
年 龄:<input type="text" NAME="age">
<input type="submit" value="注册">
</form>
</body>
</html>
具体思路:首先在urls.py访问注册页面,渲染注册方法,然后在注册方法里面写了一个注册页面,通过表单进行提交给add_user,访问注册路由,并在此获取信息,最后传输给数据库。(注意还须在主项目的urls.py中分配子路由)相应的方法渲染文件如下,包括视图文件中的方法定义,路由渲染。
app文件下的urls.py文件
from django.urls import path
from . import views
urlpatterns = [
path('register/',views.register),
path('add_user/',views.add_user,name='add_user') #配置好对应的路由,取名字方便获取
]
数据库的四种增加数据方法
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
from model_test.models import User
def register(request):
return render(request,'model_test/register.html')
def add_user(request):
#方法1
name = request.POST.get('username')
age = request.POST.get('age')
res = User(name=name,age=age)
res.save() #保存数据
#方法二
bd = User()
bd.name = name
bd.age = age
bd.save()
#方法3
User.objects.create(name=name,age=age)
#方法4
User.objects.get_or_create(name=name,age=age)
return HttpResponse('添加成功')
用四种方法添加后在虚拟机展示效果如下:
mysql> select * from model_test_user;
+----+--------------+-----+--------+
| id | name | age | city |
+----+--------------+-----+--------+
| 1 | 墨染 | 16 | 长沙 |
| 2 | wg3134000060 | 16 | 长沙 |
| 3 | yyyy | 20 | 长沙 |
| 4 | kkla | 24 | 长沙 |
| 5 | kkkls | 20 | 长沙 |
+----+--------------+-----+--------+
数据库的查询数据方法
all()和filter()方法返回的是QuerySet对象.
get()方式返回的单个对象,如果符合条件的对象有多个,则get报错!
def select_user(request):
#查询所有数据
res = User.objects.all()
#查询单个数据
res = User.objects.get(name = '墨染')
#查询满足条件的数据
res = User.objects.filter(name='墨染',age=16)
print(res)
return HttpResponse('查询完成')
- 从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet.
- QuerySet是可迭代对象.
- QuerySet支持切片, 不支持负索引.
- 可以用list强行将QuerySet变成列表.
数据库的修改数据方法
def update(request):
#方法1
user = User.objects.get(id=2)
user.name = 'xxx'
user.age = 18
user.save()
return HttpResponse('数据修改完毕')
#方法2
User.objects.filter(id=1).update(age=67)
数据库的删除数据方法
def delete_user(request):
User.objects.get(id=4).delete()
User.objects.filter(id=2).delete()
#全部删除
User.objects.all().delete()
return HttpResponse('删除完成')
**注意:**在实现以上方法的时候,记得在urls.py中添加路径。