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.根据数据库中表的字段修改对应模板的模板变量

优质内容筛选与推荐>>
1、处理器伪操作 /
2、在 Mac OS X 中启用和使用“root”用户
3、EXTJS4自学手册——页面控件(表格的插件)
4、Python之函数递归与迭代
5、第二周Python笔记之 变量的三元运算


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号