【一】ORM操作
【1】配置数据库
(1)默认数据库
- Django默认的数据库是sqlite3数据库
- settings.py 文件中配置数据库如下
python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
(2)修改为MySQL
- 最好是注释掉之前的,重新写
python
DATABASES = {
"default": {
"ENGINE": 'django.db.backends.mysql',
# 数据库名字
"name": "pycharm_data",
"USER": 'root',
"PASSWORD": "000",
"HOST": "localhost",
"PORT": 3306,
"CHARSET": 'utf8mb4',
}
}
-
此时运行启动项目将会报错
-
需要添加猴子补丁
-
在项目的
__init__.py
或者应用下的初始化py文件下添加都可以 -
建议在项目的初始化文件下添加
pythonimport pymysql pymysql.install_as_MySQLdb()
-
【2】ORM
(1)什么是ORM
- ORM(对象关系映射)(Object Relational Mapping)是一种编程技术,用于在面向对象的程序和关系型数据库之间建立映射关系,将数据库表的数据映射为对象,以便于在程序中进行操作和处理。
- 数据库中的表 映射为Python中的类
- 数据库中的字段 映射为Python中的属性
- 数据库中的记录 映射为Python中的对象或实例
(2)特点
- 简化数据库操作:ORM隐藏了底层数据库的复杂性,开发人员可以使用面向对象的方式进行数据库操作,而无需编写复杂的SQL语句。
- 提高开发效率:ORM提供了高级的抽象层,可以通过简单的代码实现数据库的增删改查操作,减少了开发人员的工作量和时间消耗。
- 跨数据库平台:ORM框架通常支持多种数据库系统,开发人员可以使用相同的代码和API来操作不同的数据库,提高了应用的可移植性和扩展性。
- 对象化数据操作:ORM将数据库表映射为对象,开发人员可以直接使用对象的属性和方法来操作数据,更加符合面向对象的编程思维。
- 数据一致性和安全性:ORM框架通常提供了事务管理和数据验证等功能,确保数据的一致性和安全性,避免了手动处理事务和验证的繁琐工作。
- 灵活的查询和关联操作:ORM提供了丰富的查询和关联操作,可以通过链式调用、过滤器、聚合函数等方式灵活地查询和操作数据。
- 自动化的数据库表结构生成:ORM框架通常能够根据定义的对象模型自动生成数据库表结构,简化了数据库的设计和维护工作。
【3】ORM之表操作
(1)定义表
- 创建一个用户表
- 那么根据ORM的映射可知,我们要创建一个类
- app01 --> models.py
python
from django.db import models
# Create your models here.
class User(models.Model):
# username varchar(20)
username = models.CharField(max_length=20)
# password varchar(20)
password = models.CharField(max_length=20)
(2)Migrations
- Migrations(迁移)是数据库迁移的具体实现方式,它是一组用于描述数据库结构变更的脚本或代码。
- 每个迁移文件代表一个数据库版本的变更,包含了新增表、修改表结构、添加字段、删除字段等操作。
- 在修改models文件后,一旦启动项目
- 操作记录记录将保存在migrations文件夹
- 但是此时并没有同步到数据库中,所以数据库是没有数据的
- 所以需要进行数据库迁移
- 只要修改了应用下的models那么就必须要进行数据库迁移
(2)数据库迁移
- 生成数据库迁移文件
python
python manage.py makemigrations
- 数据库迁移
python
python manage.py migrate
- 在数据库中会创建很多的表
- 除了我们创建的表,其他现在都不用管
- 我们创建的表,表名添加了前缀
- 是为了区分不同的所应用创建的
【4】ORM字段操作
- 修改以后,记得进行数据迁移
(1)常用的字段类型
- 整型IntegerField():
- null=True:字段值可以为空,默认为False
- default:修改默认值
- Charfield()
- max_length:这个参数必须写,字符串长度
- DecimalField()
- max_digits:最大位数包括小数
- decimal_places:小数位数
(2)增
-
在不写主键的情况下
-
会自动创建主键,字段名为id
pythonid = AutoField(primary_key=True)
-
-
如果原来没有数据
- 可以正常修改,然后进行数据库迁移
-
如果原来有数据
- 那么需要指定指定默认字段是否可以为空。或者指定字段默认值,才可以进行字段新增
(3)删
- 可以直接注释或者删除字段语句
- 但是在数据迁移之前一定要确认好
- 删除的字段,所有值将一起删除
【5】ORM数据操作
(1)增加
- 语法一
- 直接用类名创建
- 然后执行save操作
python
obj = MyModel(field1=value1, ...)
obj.save()
- 语法二
- 调用类的objects下的create方法
- 不需要在save了
python
MyModel.objects.create(field1=value1, ...)
(2)查询
- 查询全部,语法:
- 调用类的objcets下的all方法
python
MyModel.objcets.all()
- 筛选查询
- 语法一
- 调用类的objcets下的get方法
- 多个参数之间是and的关系
- 返回值为单个对象,不存在将会报错
python
MyModel.objcets.get(field=value, ...)
- 筛选查询
- 语法二
- 调用类的objcets下的filter方法
- 多个参数之间是and的关系
- 返回值为多个对象,不存在将返回(QuerySet)
python
MyModel.objcets.filter(field=value, ...)
- 去除指定条件的查询
- 和fileter相反
python
MyModel.objcets.exclude(field=value, ...)
(3)更改
- 方式一
- filter查询
- update更改
- 将修改所有满足条件的
- 单个对象不支持update
python
MyModel.objects.filter(filed=value,...).update(field=value, ...)
- 方式二
- get查询单个
- .属性=新值
- 最后save
python
obj = MyModel.objects.get(field=value, ...)
obj.filed = value
obj.save()
(4)删除
- 单个删除
- 先get单个
- 然后delete
python
obj = MyModel.objects.get(field=value,...)
obj.delete()
- 批量删除
- 先filter得到查询集
- 然后delete
python
MyModel.objects.filter(field=value,...).delete()
(5)可以在应用的test.py文件里测试
python
from django.test import TestCase
# Create your tests here.
import os
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings')
import django
django.setup()
from 应用名 import models
# 测试
res = models.User.objects.all()
print(res)