django支持各类主流的数据库,项目根目录中的db.sqlite就是数据库文件,默认状况下django配置的就是这个文件,它是个文件类型的数据库,比较小
一.数据库的链接配置
django 链接mysql的配置流程:
(1) 安装 pymysql: pip install pymysql
(2)建立数据库用户 这里须要有建立数据库权限的用户!
1)可使用navicat管理mysql数据库
2)通常项目会有数据库人员负责,这里练习咱们使用root帐户进入mysql而后建立一个有建立数据库权限的用户:
(1)输入命令,首先远程链接SSH,mysql -uroot -pqwe123;进入mysql
(2)建立新用户:mysql> create user zx_root IDENTIFIED by 'xxxxx'; //identified by 会将纯文本密码加密做为散列值存储
zx_root是用户名,'xxxxx'是密码,用户名和密码能够替换为咱们本身的内容,密码要用引号括起来,
****注意mysql语句后面要有;才能结束
(3)给权限:mysql> grant all on *.* to zx_root;
(4)查看用户权限:mysql> show grants for zx_root;
(5)使受权当即生效:FLUSH PRIVILEGES;
(3)建立数据库crm
create database crm;
(4) 修改配置
项目文件夹里的settings下的DATABASES,default里的'ENGINE'(引擎)的值,把backends(后端).后面的sqlite3改为mysql
把 'NAME'的值改成'crm'
增长键值对'USER':'root', ----若是上面建立好了有建立数据库权限的用户,则输入该用户的名字
增长键值对'PASSWORD':'qwe123', --------若是使用建立的用户,填入该用户的密码
增长键值对'HOST':'127.0.0.1',
增长键值对'PORT':'3306', #这里用字符串或者数字均可以,最好字符串
(5)修改项目文件夹(settings.py文件所在的目录)下__init__.py 文件写上:
import pymysql #若是环境中新装的pymysql导入不了。close project一下从新进入
pymysql.install_as_MySQLdb() #历史缘由,由于python2的时候用的MySQLdb,因此要加这个
(6)设置时区 仍是在settings.py里 TIME_ZONE = 'Asia/ShangHai' # 北京时间
二.django的ORM系统
-对象关系映射(Object Relational Mapping,简称ORM)!
底层仍是执行的SQL,必须经过SQL才能操做数据库,只是写代码这一层看不到
简单的说就是用面向对象的方式,描述数据库,操做数据库,
达到不用编写SQL语句就能对数据库进行增删改查。
映射关系:
模型类对应数据表,类属性对应表字段名,类的实例对应表中的一条数据
模型类必须写在app下的models.py文件中,模型若是须要映射到数据库,所在的app必须被安装
三.模型的建立与激活
1.建立模型:(1)teacher这个app文件夹中的models.py中,建立类 class Student(models.Model) --必须继承models.Model
Student的模型,表明学生
(2)建立字段名(类变量,类属性):1)name = models.CharField(max_length=)
---CharField自己也是一个类,他有一个必备参数max_length,至关于sql中varchar的长度
2)age = models.SmallIntegerField(default=0)
---默认值default也能够不给,
3)qq = models.CharField(max_length=20,default='')
---CharField 最好不要让他None,能够给个空字符串作默认值
---通常数据库中qq,电话号码这些用字符串而不是int类型,操做方便
4)c_time = models.DateTimeField(verbose_name='建立时间')
---建立时间字段,verbose_name参数是提示信息,是给人看的,人类可读的名称
能够是位置参数,放第一个,也能够是关键字参数
还能够加一个参数auto_now_add=True,这样就不须要手动输入时间了,django自动帮咱们处理,
保存当前对象的时候就会自动填入当前时间
5)id 通常省略就好了,不用咱们手动添加,
若是模型类中咱们没有定义主键,模型类会自动帮咱们加了一个以下的id类属性
id = models.IntegerField(primary_key=True,auto_created=True)
建立的全部模型类实例都自动给个这个属性
总结:
1. 每个模型都是django.db.models.Model的子类
2. 类变量 表示模型中的数据库字段
3. 每个字段由一个字段类的实例表示
注意:
(1)每一个变量名也就是数据库中表的列名,要机器友好,即用ASSIIC码中的字符,不要用中文,不要用数字,不要_开头,数字开头
(2)字段名中verbose_name参数通常都在第一个位置参数,指定人类可读的名称,若是定义时没有加这个参数,则直接使用字段名
(3)CharField字段必须提供max_length参数,他是必须参数,不光对数据模型起做用,也对数据库起做用,还对校验起做用(Form表单中会看到)
(4)字段还有不少可选参数,好比default,它对应数据库中的默认值
2.激活模型:有了以上建立的模型,django会为这个应用程序建立一个数据库模式,
也就是先会建立表,生成SQL语句,根据上面的模型类建立去访问Student对象的python数据库的API,
为了实现这些,咱们要在项目文件夹中的settings.py中注册
1.在项目中注册app:INSTALLED_APPS中加入app名
2.运行数据库迁移命令(必定要在项目根目录下)
python manage.py makemigrations teacher
-若是不加app名teacher,则会对(settings.py的INSTALLED里安装过的)全部app进行迁移
告诉django,咱们作了哪些数据库的更改
迁移,是django对模型的更改方式,会生成迁移文件,相似于app下的migrations文件夹下的0001_initial.py这样,咱们甚至能够手动更改迁移文件的内容
迁移以后,mysql中能够能够进入建立的数据库,这时修改只是被记录下来,数据库中尚未表
sqlmigrate 从迁移获取sql语句:python manage.py sqlmigrate teacher 0001 ---这里不用写全0001_initial.py,teacher这是应用名称,必须写上
迁移会生成的SQL语句以下:
--
-- Create model Student
--
CREATE TABLE `teacher_student` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, ---若是咱们没有建立主键,这里会自动建立名为id的主键,至关于模型类自动默认给咱们添加了这个类属性,
`name` varchar(20) NOT NULL,
`age` smallint NOT NULL,
`sex` smallint NOT NULL,
`qq` varchar(20) NOT NULL,
`phone` varchar(20) NOT NULL,
`c_time` datetime(6) NOT NULL);
COMMIT;
3.运行migrate命令,使迁移生效
python manage.py migrate teacher ---若是写上app名,则只会迁移这个app中的模型,不写则注册过的都迁移
这以后咱们建立的数据库中才会生成表,
# 表名 appname_模型name.lower
django_migrations是默认生成的记录migration的表
四.数据的增删改查
(1)工具 djang shell 调试工具(scrapy的shell借鉴了django的)
用shell以前最好先在环境中装ipython ,而后直接运行命令进入shell,只要装了ipython,默认就能进入ipython的shell
python manage.py shell
(2)进入shell命令行后,首先导入models:from teacher.models import Student ---输一半按tag能够补全
想查看student中有没有数据,能够: Student.objects ----objects是模型的一个方法,它实际上是一个管理器,
它自己也是一个对象,建立了模型它就连上了,每个模型都有一个objects,经过objects就能够操做、管理模型
(3)想查询模型中全部的值,能够Student.objects.all()
---它返回的是一个查询集对象,返回的值不算友好,默认返回<QuerySey:[<Student:Student Object(1)>,<Student:Student Object(2)>,....]>
若是咱们想让他运行时直接显示实例对象的各个实例属性打印出来,则模型类中能够重写方法__str__:
def __str__(self):
return '%s-%s'%(self.name,self.age)
这个方法对数据库不形成任何影响,不用作数据库迁移,可是重写后须要从新进入shell,并从新导入库才能起做用,
模型自动建立了id这个属性,这里重写的__str__方法返回值多个self.id也是能够的
return '%d-%s-%s' % (self.id, self.name, self.age),建立的实例对象都带个id的实例属性
若是建立了实例对象,这时候Student.objects.all() 的结果是<QuerySey:[<Student:1-贝吉塔-3>,<Student:2-特兰克斯-17>,....]>
(4)想查询模型中某个值,能够定义s = Student.objects.get(id=1),而后s,得到符合条件的某实例,s.name,s.age这样还能查到该实例的对应属性值
(5) 增:
4种方法:在shell环境中,无论什么方法首先都要保证导入了models:from teacher.models import Student
1)表中一条数据,对应模型类中的一个实例,即一个对象,建立一条,能够实例化一下,表的字段在实例化的过程当中经过传递参数加进去
(1)实例化:s1 = Student(name='贝吉塔',age='3',qq='123456')
(2)保存: s1.save() 为了不输错,实例化后数据库中尚未数据,想把实例化的对象保存到数据库,须要运行save方法
注意存在数据库中的时间字段必定是UTC时间,为了避免同时区不一样格式的统一,
而取出来的时间则转换成settings里设置的时区,取出来的时间指的是是渲染在模板中显示的时间
模型类实例中怎么查询,打印,出来的还都是utc时间
2)建立空实例,而后赋值
(1)先建立一个空实例s2 = Student()
(2)依次赋值实例属性s2.name = '特兰克斯'
s2.age = 17
.....
(3)保存:s2.save()
3)直接create:Student.objects.create(实例属性1,实例属性2.。。)
这种方法直接操做数据库,给表添加记录
运行这个命令后,建立记录同时,直接能够返回刚建立的对象
4)get_or_create:相似于上面的create
s=Student.objects.get_or_create(实例属性1,实例属性2.。。)
这种方式先查,查完再建立,返回一个元组,元组第一个元素是该对象,第二个元素是是否建立成功:
若是模型中已经有该对象,则元组第一个元素则是该对象,第二个元素是false,即没有建立该对象,是查来的
若是模型中尚未该对象,则元组第一个元素是该对象,第二个元素是True,即建立了该对象,
***亲测是否同一对象取决于建立时给的参数是否彻底一致,前面同样多给个元素,也会建立,而不是返回查询结果和False的元组
别的参数相同,改其中一个参数,也会建立
5)增长模型类实例数据,也能够在app的视图函数中,导入模型类,而后定义函数,增长类的实例,上述四种方法,能够在视图函数模块中,先导入模型类
from .models import Student
def add_student(request):
方法一:实例化,而后save。。。。
方法二:实例化一个空的对象,而后定义实例属性,而后save。。。
方法三:直接create
方法四:get_or_create
return render(request,模板文件)
(6)查:
1)Student.objects.all() --查全部,他返回QuerySet对象
(1)咱们写res=Student.objects.all()的时候,这样写尚未操做数据库,
它是一个惰性的,只有咱们要把这个值计算出来的时候它才操做数据库
(2)查询集能够看到sql语句print(res.query),结果其实就是至关于select * from teacher_student的sql语句
(3)shell中输入res的时候返回的查询集,他能够循环能够迭代,还能够切片
切片print(res[1:2].query)
切片返回的结果比上面不切片的后面多了两个东西LIMIT 1 OFFSET 1
LIMIT --获取数量,OFFSET偏移量
2)Student.objects.get(条件) --查询一条,他返回的不是查询集,而是一个对象,
执行时马上操做数据库,没有query,拿不到它的sql语句,只能在mysql日志上看到他的sql语句
至关于数据库中的select * from 表名 where 条件。。。。
***get方法返回一条数据,若是匹配到符合条件的有不少条,则会报错
因此get方法通常只和主键对应,可是表里的主键不见得都叫id
这里有个快捷方式pk,它表明了表的主键,无论表的主键叫什么,用pk查均可以
3)filter:res=Student.objects.filter(参数=值) --返回查询集
print(res.query) -至关于sql中用where的结果
(7)修改:
1)赋值:s=Student.objects.get(name='xxx')
s.age=16
s.save()
查完修改,用于改一条数据,别忘了save()保存的时候才能把修改保存到数据库
2)update:Student.objects.filter(name='xxx').update(age=16)
把匹配出来的全部符合条件的数据的年龄都改为16,返回修改的记录条数
(8)删除:delete()方法
1)删一条:s=Student.objects.get(pk=2)
s.delete() ----返回一个元组,第一个元素是删除的数据条数,第二个元素是{'表的名称':删除的数据条数}
2)批量删:Student.objects.filter(sex=1).delete()
返回元素,(删除的数据条数,{'表名':删除的数据条数})
(9)计数:Student.objects.count() ----返回模型类实例数
五。应用到视图:
1.首先视图函数的模块中导入模型类:from .models import Student
2.视图函数中student=Student.objects.all()
3.根据数据库中表的字段修改对应模板的模板变量
python