Django开 发操作数据库比使用pymysql操作更简单,内部提供了ORM框架。
下面是pymysql 和orm操作数据库的示意图,pymysql就是mysql的驱动,代码直接操作pymysql ,需要自己写增删改查的语句
django 就是也可以使用pymysql、mysqlclient作为驱动,但是目前对mysqlclient的支持更好,在驱动的基础只上封装了orm框架,不用直接去写sql,是操作更简单了。
pip install mysqlclient
我的是windows环境,这样安装的时候报错,我们需要先下载需要先下载mysqlclient whl文件
下载地址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
或者https://pypi.org/project/mysqlclient/#files
找对对应的python版本下载,我的是3.7就下载这个
下载后,放到一个目录,cmd 进入到该目录,再执行
pip install mysqlclient-1.4.6-cp37-cp37m-win_amd64.whl
就可以安装成功了。
ORM可以帮助我们做两件事:
在settings.py中配置mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'unicom',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '10.172.3.171',
'PORT': 3306,
}
}
在app01目录下的models.py 中写一个类,类名是UserInfo, 那么表面就会是app01_userinfo,django会自动加上app的名字
字段 通过models来创建,选择不同的字段类型,常用的字段类型有:
CharField 字符型
IntegerField 整形
DecimalField 浮点型
DateField 日期类型,只包含年月日
DateTimeField 日期类型,包含年月日时分秒
BigIntegerField 长整型
SmallIntegerField 小整型
from django.db import models
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
在app01下面的models.py中创建一个UserInfo的类,必须继承models.Model
django 会帮我们自己创建一个表名为app01_UserInfo的表,包含字段name, password,age
相当于执行下面语句
create table app01_userinfo(
id bigint auto_increment primary key,
name varchar(32),
password varchar(64),
age int
);
每个表都会自动给创建id列
执行命令创建数据库表: 注意app要先注册
py -3 manage.py makemigrations
py -3 manage.py migrate
如果已经手动创建了admin表的,要用orm 来连接数据库可以,又不希望django改变表明,指定数据表名称,通过内部类 Meta指定表名
from django.db import models
class admin(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
# 添加一个时间字段
create_time = models.DateTimeField(null=True)
class Meta:
db_table = 'admin'
在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据:
age=mode1s.IntegerField(default=2)
data=models.IntegerField(null=True, blank=True )
一般是在实现的函数中来操作数据库
在views.py中要导入 from app01 import models
查询类
models.UserInfo.objects.all() #查询数据库中所有内容,返回的是[obj,obj,obj],一行数据一个对象
models.UserInfo.objects.filter(id=nid).first() #根据条件查询,只获取第一个对象
对字符串的查询
models.PrettyNum.objects.filter(mobile='136') #等于136
models.PrettyNum.objects.filter(mobile__startswith='136') #以136开头
models.PrettyNum.objects.filter(mobile__endswith='888') #以888结尾
models.PrettyNum.objects.filter(mobile__contains='136') #包含136
对于数字的查询
models.PrettyNum.objects.filter(id=12) #等于12
models.PrettyNum.objects.filter(id__gt=12) #大于12
models.PrettyNum.objects.filter(id__gte=12) #大于等于12
models.PrettyNum.objects.filter(id__lt=12) #小于12
models.PrettyNum.objects.filter(id__lte=12) #小于等于12
查询支持两种不同的写法
models.PrettyNum.objects.filter(id=3,mobile='12312341234')
data_dict = {'mobile':'13413241234','id':3}
models.PrettyNum.objects.filter(**data_dict)