【8.0】Django框架入门之ORM操作
【一】配置数据库
【1】默认数据库
- 在 settings.py 文件中有一个配置项就是配置数据库的
- 但是Django默认的数据库是sqlite3数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
【2】指定数据库
- 修改 settings.py 中的数据库配置项
- 模版
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
# 数据库名字
'NAME': "",
# 数据库用户名
"USER": "",
# 数据库密码
"PASSWORD": "",
# 数据库 IP,本地默认是127.0.0.1/localhost
"HOST": "localhost",
# 数据库端口
"PORT": 3306,
# 数据库编码
"CHARSET": "utf8mb4",
}
}
- 示例
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
# 数据库名字
'NAME': "user_data",
# 数据库用户名
"USER": "root",
# 数据库密码
"PASSWORD": "1314521",
# 数据库 IP,本地默认是127.0.0.1/localhost
"HOST": "127.0.0.1",
# 数据库端口
"PORT": 3306,
# 数据库编码
"CHARSET": "utf8mb4",
}
}
【3】指定MySQL数据库报错
-
django 默认使用mysqldb模块链接mysql
-
但是该模块的兼容性不好,需要手动修改为pymysql链接
(1)解决办法一:猴子补丁
- 在项目下的
__init__
或者任意的应用名下的__init__
文件中书写一下代码
import pymysql
pymysql.install_as_MySQLdb()
(2)解决办法二:下载第三方模块
- 直接安装
pip install mysqlclient
- 运气好不会报错,但是运气不好就会报错
(3)Win报错解决办法(下载whl文件)
-
下载对应的whl版本文件
-
安装(切换到指定目录下执行 pip 安装命令)
pip install pip mysqlclient-2.2.4-cp310-cp310-win_amd64.whl
(4)Mac报错解决办法
[1]步骤一:安装mysql-client
brew install mysql-client
[2]步骤二:安装组件
brew link --force --overwrite mysql-connector-c
[3]步骤三:修改mysql_config
sudo vim /usr/local/mysql/bin/mysql_config
- 替换内容
# 旧内容
# on macOS, on or about line 112:
# Create options
libs="-L$pkglibdir"
libs="$libs -l "
# 新内容
libs="-L$pkglibdir"
libs="$libs -lmysqlclient -lssl -lcrypto"
[4]步骤四:安装编译工具
- 如果一直报错
Exception: Can not find valid pkg-config name.
- 因为
pkg-config
工具在系统路径中未找到。pkg-config
是一个用于查找软件包编译和链接所需配置信息的工具,特别是对于 C/C++ 库。 - 在构建 MySQLclient 库时,
setuptools
需要通过pkg-config
获取mysqlclient
的编译器标志(CFLAGS)和链接器标志(LDFLAGS)。由于找不到pkg-config
,导致无法确识别和处理与 MySQL 相关的库文件和头文件位置。
brew install pkg-config
[5]步骤六:安装mysqlclient
pip install mysqlclient
【二】连接数据库
【1】连接sqlite3数据库
【2】连接MySQL
【三】ORM介绍
【1】什么是ORM
-
ORM是一种将对象与关系型数据库之间的映射的技术,主要实现了以下三个方面的功能:
-
数据库中的表映射为Python中的类
-
数据库中的字段映射为Python中的属性
-
数据库中的记录映射为Python中的实例
-
-
ORM的主要优点是可以减少开发人员编写重复的SQL语句的时间和工作量,并且可以减少由于SQL语句的调整和更改所带来的错误。
【2】Django ORM的优点
- 与其他ORM框架相比,Django ORM拥有以下优点:
- 简单易用:Django ORM的API非常简单,易于掌握和使用。
- 丰富的API:Django ORM提供了丰富的API来完成常见的数据库操作,如增删改查等,同时也支持高级查询和聚合查询等操作。
- 具有良好的扩展性:Django ORM可以与其他第三方库进行无缝集成,如Django REST framework、Django-Oscar等。
- 自动映射:Django ORM支持自动映射,开发者只需要定义数据库表的结构,就可以自动生成相应的Python类,从而减少开发过程中的重复代码量。
【四】ORM操作之表操作
【1】定义模型表
- 在
models.py
文件中定义模型表
from django.db import models
# Create your models here.
# 定义模型类 类名默认即表名,但是后面可以自定义表名
class User(models.Model):
# 定义表字段,当前字段名为 username , 当前字段类型为字符串类型 , 当前字段约束为最多20个字符
username = models.CharField(max_length=20)
# 定义表字段,当前字段名为 password , 当前字段类型为字符串类型 , 当前字段约束为最多20个字符
password = models.CharField(max_length=20)
【2】数据库迁移
(1)生成迁移文件
-
将操作记录记录在migrations文件夹
-
虽然文件夹内有相关文件,但是此时并没有同步到数据库中,所以数据库是没有数据的
-
manage.py 执行相关命令
-
方式有两种
- 一种是 task 任务里面
- 一种是命令行
python manage.py makemigrations
(2)迁移记录生效
- 将操作同步到真正的数据库
python manage.py migrate
(3)提醒
- 只要修改了models中有关数据库相关的代码,就必须执行上面的数据库迁移命令
【3】示例
(1)定义模型表
- 修改数据库操作时候,一定要进行数据库的重加载(我自己的叫法)
from django.db import models
# Create your models here.
class User(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True)
# username varchar(32)
username = models.CharField(max_length=32,verbose_name="用户名")
# CharField : 必须指定 max_length 参数 ,不指定就会报错
# verbose_name : 该参数所有字段都可以使用,就是一个注释语法
# password int
password = models.IntegerField()
class Author(models.Model):
# 由于一张表中必须要有一个主键字段,并且一般情况下都叫id字段
# 所有当我们没有定义 主键 id字段 的时候,orm会帮我们创建一个名为 id 的主键字段
# 也就意味着后续我们在创建模型表的时候,如果主键字段名没有额外的叫法,那么主键字段可以省略不写
# username varchar(32)
username = models.CharField(max_length=32)
# password int
password = models.IntegerField()
(2)迁移数据库
python manage.py makemigrations
python manage.py migrate
(3)数据库生效
mysql -uroot -p
use user_data
desc app01_user;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(32) | NO | | NULL | |
| password | int(11) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
desc app01_author;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| username | varchar(32) | NO | | NULL | |
| password | int(11) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
【五】ORM操作之字段操作
【1】字段属性
(1)允许为空
- 在定义模型类的相应字段时,可以为该字段添加
null=True
属性以允许其值为None
或空字符串。
class MyModel(models.Model):
name = models.CharField(max_length=50, null=True) # 允许name字段为空
(2)指定默认值
- 设置字段的默认值可通过在字段定义时附加
default
参数实现。例如,给字段age
设置默认值为 18
class MyModel(models.Model):
age = models.IntegerField(default=18) # 默认年龄为18岁
【2】字段增加
- 要在 Django 模型表中增加新的字段,只需在相应的 Model 类中添加新字段及其类型和所需属性。
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=50)
created_at = models.DateTimeField(auto_now_add=True) # 新增一个自动记录创建时间的datetime字段
is_active = models.BooleanField(default=True) # 新增一个布尔类型字段,默认激活状态为True
【3】字段删除
- 要从模型表中删除字段,请直接在 Model 类中注释掉该字段或者将其完全移除。
- 不过,在生产环境中删除字段前请确保不会影响现有数据,因为这可能导致数据丢失或结构不一致。
class MyModel(models.Model):
name = models.CharField(max_length=50)
created_at = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True) # 移除is_removed字段
【补充】
- 每次修改关于数据库字段的操作时,都要执行数据库的迁移相关操作
python manage.py makemigrations
python manage.py migrate
【六】ORM操作之数据操作
【1】增加
(1)语法
模型表名.objects.create(字段名=字段值)
(2)示例
new_instance = MyModel.objects.create(
name="张三",
age=25,
email="zhangsan@example.com"
)
【2】查询
(1)语法
- 获取到当前表中的全部数据
模型表名.objects.all()
- 根据指定条件筛选数据
# 方式一
模型表名.objects.get(筛选字段名=筛选字段值)
# 方式二
模型表名.objects.filter(筛选字段名=筛选字段值)
- 去除指定条件的数据
模型表名.objects.exclude(筛选字段名=筛选字段值)
(2)示例
# 获取表中所有数据
all_records = MyModel.objects.all()
# 根据特定条件筛选数据(方式一)
filtered_records = MyModel.objects.get(name="张三")
# 根据特定条件筛选数据(方式二)
# 查询包含"张"的所有name
filtered_records = MyModel.objects.filter(name__contains="张")
# 去除满足指定条件的数据
# 过滤掉所有年龄小于18岁的记录
excluded_records = MyModel.objects.exclude(age__lt=18)
【3】更改
(1)语法
# 方式一:先查询直接修改
模型表名.objects.filter(筛选字段名=筛选字段值).update(修改字段名=修改字段值)
# 方式二:先查询后修改
obj = 模型表名.objects.get(筛选字段名=筛选字段值)
obj.修改字段名=修改字段值
obj.save()
(2)示例
# 可以使用.filter() 和 .update() 方法批量更新符合条件的数据
# 所有年龄为25的记录年龄改为26
MyModel.objects.filter(age=25).update(age=26)
# 更新已有记录的值,可先通过查询获取对象实例后调用 .save() 方法
instance_to_update = MyModel.objects.get(name="张三")
instance_to_update.age = 26
instance_to_update.save()
【4】删除
(1)语法
# 方式一:删除需要先查询直接删除
模型表名.objects.filter(筛选字段名=筛选字段值).delete()
# 方式二:删除需要先查询再删除
instance_to_delete = MyModel.objects.get(筛选字段名=筛选字段值)
instance_to_delete.delete()
(2)示例
# 删除满足特定条件的记录,通常先通过查询获取对象实例再调用 .delete() 方法
instance_to_delete = MyModel.objects.get(name="张三")
instance_to_delete.delete()
# 可以使用 .filter() 方法批量删除
MyModel.objects.filter(name="李四").delete() # 删除所有名字为"李四"的记录
【示例】
【1】前端
【2】后端
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/18036057