Django的ORM简介
概念
Object Relational Mapping—-对象关系映射
优点
不用直接编写SQL代码,只需要像操作对象一样操作数据库
操作逻辑
- 在MySQL中建立数据库
- 在模型文件下书写类及函数
- 完成二者映射,在数据库表中可以查询到数据
数据库连接配置
MySQL的用户配置
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 rows in set (0.04 sec)
mysql> create database book charset=utf8;
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> create user tz identified by 'tz123';
Query OK, 0 rows affected (0.04 sec)
mysql> grant all on book.* to 'tz'@'%' with grant option;
Query OK, 0 rows affected (0.01 sec)
mysql>
验证创建结果
C:\Users\41999>mysql -u tz -p
Enter password: *****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.24 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| book |
| information_schema |
+--------------------+
2 rows in set (0.00 sec)
mysql> \q
Bye
在settings中配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'book', #数据库名称
'USER': 'tz', # 链接数据库的用户名
'PASSWORD': 'tz123', # 链接数据库的密码
'HOST': '127.0.0.1', # mysql服务器的域名和ip地址
'PORT': '3306', # mysql的一个端口号,默认是3306
}
}
在项目init下配置数据库
import pymysql
pymysql.install_as_MySQLdb()
包准备
## 用于操作的包
pip install cryptography
pip install PyMySQL
--------------------------------------------------------------------------->
## views.py视图中使用的包
from django.shortcuts import render
from .models import User
from django.http import HttpResponse
--------------------------------------------------------------------------->
模型使用方法
###数据库表名
模型类如果未指明表名,Django默认以小写**app应用名_小写模型类名为数据库表名**。
可通过**db_table**指明数据库表名。
###关于主键
django会为表创建**自动增长**的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。
###属性命名限制
不能是python的保留关键字。
不允许使用连续的下划线,这是由django的查询方式决定的。
定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
属性=models.字段类型(选项)
模型的创建和映射
模型文件的书写
from django.db import models
# Create your models here.
"""
继承自谁models
模型类和数据库关系
属性和表字段对应的关系
"""
class User(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField() # 年龄一般均为1-100,所以指定长度没有太大的意义,但这可能成为一个攻击点
gender = models.BooleanField()
class Meta:
db_table = 'user' # 指定表名
def __str__(self):
return self.name
数据迁移过程
(tzblog) C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py check
C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook
System check identified no issues (0 silenced).
C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py makemigrations book
C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook
Migrations for 'book':
book\migrations\0001_initial.py
- Create model User
C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py migrate
C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook
Operations to perform:
Apply all migrations: admin, auth, book, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying book.0001_initial... OK
Applying sessions.0001_initial... OK
查看迁移过程
C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py sqlmigrate book 0001
C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook
BEGIN;
--
-- Create model User
--
CREATE TABLE `user` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(20) NOT NULL, `age` integer NOT NULL, `gender` bool NOT NULL
);
COMMIT;
数据的增删改查
使用逻辑
视图层:四种增删改查的语句嵌套在视图层中定义
使用HttpResponse返回查询结果,
HTML5:展示能否操作成功,而非查询结果
URL:负责调用视图函数,相当于输入查询语句之后的回车确认
查询接口渲染
HTML5文件内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>演示数据库的增删改查</title>
</head>
<body>
<a href="#">{{user}}}</a>
</body>
</html>
增加数据
###urls.py
--------------------------------------------------------------------------
path('add_user/', views.add_user, name='add_user'), # 测试数据库操作中的的增加
###views.py
---------------------------------------------------------------------------
ef add_user(request):
'''
测试数据库的增加操作
'''
user = User(name='小鱼儿', age=17, gender=False) # 字段值的写入一定要与其属性匹配
user.save()
return HttpResponse('添加成功')
查询数据
###urls.py
--------------------------------------------------------------------------
path('search_user/', views.search_user, name='search_user'), # 测试数据库操作中的查询
###views.py
---------------------------------------------------------------------------
def search_user(request):
'''
查询数据
'''
search = User.objects.all()
# print(search)
# return HttpResponse('查询成功,结果为:{}'.format(search))
return HttpResponse('查询成功!')
# return render(request, 'database-book.html', context=search)
删除数据
###urls.py
--------------------------------------------------------------------------
path('delete_user/', views.delete_user, name='delete_user'), # 删除数据库中的值
###views.py
---------------------------------------------------------------------------
def delete_user(request):
'''
通过指定ID,删除数据
'''
User.objects.get(id=2).delete()
return HttpResponse('删除成功')
更新数据(三种方式)
###urls.py
--------------------------------------------------------------------------
path('update_user/', views.update_user, name='update_user'), # 更新数据库中的值
--------------------------------------------------------------------------->
path('modified_user/', views.modified_user, name='modified_user'), # 第二种更新数据库中的值
--------------------------------------------------------------------------->
path('ModifiedWholeFiled/', views.ModifiedWholeFiled, name='ModifiedWholeFiled'), # 第二种更新数据库中的值
###views.py
---------------------------------------------------------------------------
def update_user(request):
'''
修改成功
'''
user = User.objects.get(name='画龙老师')
user.name = '徐媛老师'
user.save()
return HttpResponse('更新成功')
--------------------------------------------------------------------------->
def modified_user(request):
''''
修改数据,使用User.objects.filter().update()
'''
User.objects.filter(name='斗鱼').update(name='熊猫TV')
return HttpResponse('第二种方法修改数据成功')
--------------------------------------------------------------------------->
def ModifiedWholeFiled(request):
''''
修改数据整个字段
'''
User.objects.update(age=18)
return HttpResponse('修改全部字段成功')
参考与引用
[数据库连接报错]:DBeaver连接mysql时Public Key Retrieval is not allowed错误解决附图片_qq_42816401的博客-CSDN博客
工具准备
### 可视化数据库---dbeaver
https://dbeaver.io/download/