ORM
类映射为表
类属性映射为表字段
类的对象实例映射为一行记录
==优点==
- 避免写SQL语句,使用面向对象的方式来操作数据库,使用比较方便。
- 实现项目与数据库解耦,切换数据库只需简单配置。
==缺点==
- 针对复杂的业务,操作比较繁琐
- 性能没有SQL效率高
Django配置数据库
在配置文件settings.py中
DATABASES = {
"default":{
"ENGINE":"django.db.backends.mysql",
"HOST":"localhost",
"PORT":"3306",
"USER":"lauf",
"PASSWORD":"lauf123",
"NAME":"my_db",
"CHARSET":"utf8",
}
}
==注意==
django连接mysql使用python的mysqlclient库,需要安装:sudo pip3 install mysqlclient
若报错mysql_config,则需在linux系统环境中安装如下依赖:
sudo apt-get install libmysqlclient-dev
sudo apt-get install default-libmysqlclient-dev
sudo apt-get install python3-dev
#查看是否安装成功
sudo apt list --installed | grep -E "libmysqlclient-dev|python3-dev"
查看pip3是否安装成功(mysqlclient)
pip3 freeze | grep -i "mysqlclient"
创建模型类
这里在user应用中,展示如何创建模型类
#在项目目录下,创建user应用
python3 manage.py startapp user
#安装应用 settings.py
INSTALLED_APPS = [
...,
"user",
]
#为应用定义模型类 user>models.py
from django.db import models
class User(models.Model):
username = models.CharField("姓名",max_length=50,primary_key=True)#必须给max_length
password = models.CharField("密码",max_length=50,null=False)
score = models.DecimalField("分数",max_digits=4,decimal_places=2) #小数点位置
is_delete = models.BooleanField("是否删除",default=False)
created_time = models.DateTimeField("注册时间",auto_now_add=True)
updated_time = models.DateTimeField("更新时间",auto_now=True)
def __str__(self):
"""打印对象时,显示的信息"""
return self.username
class Meta:
db_table = "user_table" #更改表名字
#迁移模型类,到数据库中
python3 manage.py makemigrations
python3 manage.py migrate
在没有指定主键时,Django自动创建一个id作为主键。
==练习为user表添加一个hobby字段==
#在模型类中,增加类属性
hobby = models.CharField("爱好",max_length=50,default="") #防止之前的数据没有这个字段而报错,必须给一个default
#迁移到数据库
模型类的字段类型
-
BooleanField() 对应数据库中的tinyint,0/1; Django中为True/False
-
CharField() 对应数据库中的varchar,必须指定max_length
-
DateField() 对应数据库中的date, 参数,auto_now = True, 更新时间 auto_now_add = True,第一次插入时间 default 给一个默认值
-
DateTimeField() 使用同DateField()
-
FloatField() 对应数据库中的double
-
DecimalField() 精确的小数,对应数据库decimal 必需参数:max_digits=5总位数,decimal_places=2 小数点位置
-
EmailField() 对应数据库varchar
-
IntegerField() -->int
-
ImageField() --->varchar(100) 存储路径
-
TextField --->longtext 长文本
类属性的约束
primary_key, bool, 类属性是否为主键
blank,bool,是否为空,admin后台管理的时候可以不写内容的字段
null,bool,该列是否可为null空值
default,默认值
db_index,bool,是否在该列设置索引
unique,bool, 该列的值是否唯一,唯一索引
db_column列的名称,默认使用类属性作为列名
verbose_name, 后台显示的字段名字
练习
创建一个Book模型类,类属性如下:
title, 书名,字符类型,最大长度50,且值唯一
price, 价格,精确小数,最大5位数,一位小数
publish,出版社,字符类型,最大长度50,不能为 null
打印对象时,输出书名,且修改表名为book_table\
注意:每次修改模型类,都要迁移;迁移失败,则删除migrations目录下的迁移文件,除了__init.__py,删除库,重建库,重新迁移