Django6:数据库

先安装MySQL:https://www.mysql.com/

Navicat数据库操作软件:

命令行操作效率比较低。这个软件是图形化的。

MySQL的驱动

1.MySQL-python:也就是MySQLdb。是对C语言操作MySQL数据库的一个简单封装。遵循了Python DB API v2。(https://www.python.org/dev/peps/pep-0249/ pythonDBAPI官方文档)但是只支持Python2。
2. mysqlclient:是MySQL-python的另外一个分支。支持python3(我安装的是这个,pip install就行)
3. pymysql:是用纯python实现的,执行效率不如MySQL-python,可以和python代码无缝衔接。
4. MySQL Connector/python:MySQL推出的使用纯python连接MySQL的驱动。因为是纯Python开发的,所以效率也不高。

Django配置连接数据库(MySQL)

Django连接数据库:
在这里插入图片描述
一般默认是sqlite3,改的话把sqlite3改为mysql,‘name’代表的是数据库的名字,改为你本次项目的库名,新建HOST,地址为本机地址或者购买的服务器地址,USER为你的数据库用户名,PASSWORD为你的数据库的密码,PORT默认是3306。在External Libraries中查看支持连接的数据库有
在这里插入图片描述

在Django中操作数据库有两种方式:使用原生sql语句;使用ORM模型操作。
在Django中使用原生sql语句就是使用python db api的接口来操作,使用的哪个驱动就是使用哪个驱动来操作的,只不过django将数据库连接的这一部分封装好了,只需要在settings.py中配置好了数据库连接信息后直接使用Django封装好的接口就可以进行操作了。
在这里插入图片描述CSRF是为了防止网站被伪造了一些数据,解决:在settings.py中关掉在这里插入图片描述
原生SQL的缺点:
1.SQL语句重复利用率不高,越复杂的SQL语句条越多,代码越长,会出现很多相近的SQL语句。
2.很多的SQL都是根据业务逻辑拼接出来的,如果数据库做了修改,那么就要修改逻辑。
3.原生SQL容易产生web安全问题,比如SQL注入。

ORM模型:对象关系映射模型

简单来说,就是把数据库的表映射为一个类,把行映射为一个对象实例,把字段作为属性。ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。
为什么要用ORM???
1.易用性:可以减少重复SQL语句的概率,写出来的模型也更加直观清晰。
2.性能损耗小:虽然最终也是转换为原生SQL语句,但是带来的性能损耗不足5%,综合考虑,好处是大于带来的性能损耗。
3.设计灵活:复杂的查询也比较好写。
4.可移植性:Django底层封装了数据库的实现,支持多个关系数据库引擎(MySQL PostgreSQL SQLite)可以轻松地切换数据库。
之前使用原生SQL需要先创建表,使用ORM就可以直接映射到数据库中。

创建ORM模型

如果要将一个普通的类编程一个可以映射到数据库中的ORM模型,那么必须要把父类设置为modles.Model或者它的子类。比如 class A(models.Model)
类里面的属性对应字段,对象对应一条数据。
小tip:使用makemigrations生成迁移脚本:python manage.py makemigrations
使用migration将新生成的脚本文件映射到数据库中 : python manage.py migrate

一个class对应一张表。如果没有定义id,会自动定义一个id字段,并且是自增长类型。

增删改查:
1.添加数据:先使用ORM模型创建一个对象,添加字段的内容再调用save方法进行保存。
2.查找数据:所有的查找工作都是使用模型上的objects属性来完成的:根据主键添加:u例如:user=User.objects.get(pk=2);根据字段查找:使用objects.fifter方法查找,这个方法返回的是一个QuerySet对象,这个对象类似于一个列表,可以用这个对象的first方法获取第一个值。
3.删除数据:先找到对应点额数据模型,在执行对象.delect方法
4.修改数据:先找到对应的模型,在执行save方法,比如:user.name=“aaa” 然后再user.save()

模型常用属性:

AutoField:映射到数据库中是int类型,可以有自动增长的特性。如果不指定主键,那么模型会自动生成一个叫做id的自动增长的主键,如果向指定一个其他名字并且有自动增长属性的主键使用AutoFiled也是可以的,models.AutoField(primary_key=True)
BigAutoField:64位整型,和AutoField是一样的,只不过产生的数据范围是从1-9223372036854775807
BooleanField:在模型层面接收的是True/False,在数据库层面是tinyint类型,如果没有指定默认值,默认值是none。如果想要指定可以为null就要设置NullBooleanField()
CharField:在数据库就是varchar类型,在python层面是普通字符串,一定要指定最大长度,否则会报错。如果超过了254个字符,那么就不建议使用,推荐使用TextField。
DateField:日期类型,在pyhton中是datetime.date类型,可以记录年月日。在映射到数据库中也是date类型。使用这个Field可以传递一下几个参数:1.auto_now:每次在这个数据保存的时候使用当前时间,比如记录操作时间,可以将这个属性设置为True。2.auto_now_add:在每次数据第一次被添加进去的时候,都使用当前时间,比如作为一个记录第一次使用的时间,就可以将这个属性设置为True。
DateTimeField:日期时间类型,和DateField类似,不仅可以存储日期还可以存储时间,映射到数据库是datetime类型。一般是UTC时区,要修改的话不仅要修改TIME_ZONE还需要把USE_TZ设置为False。
在这里插入图片描述

TimeField:时间类型,在数据库中是time类型,在python中是datetime.time类型。
EmailField:类似于CharField。在数据库层面也是varchar类型,只不过可以在存储字符串的时候检测这个字符串是否是一个有效的邮箱。不设置最大长度的话最大长度是254个字符。不一定一定要是邮箱格式的数据,在数据库层面没有多大意义但是在ModeForm表单的时候会进行验证。
IntegerField:整型。负的2的31次方到2的三十一次方减一
BigIntegerField:大整形。PositiveIntegerField:正整形。
SmallIntegerField:小整形:-32768-32767
PositiveSmallIntegerField:正小整形
UUIDField:只能存储uuid格式的字符串,uuid是一个32位全球唯一的字符串,一般用来做主键。
URLField:类似于CharField,只不过只能用来存储url格式的字符串,并且默认max_length是200

外键和表的关系

外键:在MySQL中,表有两种引擎,一种是InnoDB,一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常强大。
使用的时候需要用到ForeignKey(to,on_delete,**options)类,第一个参数是引用的是哪个模型也就是哪一张表,第二个参数是在使用外键引用的模型数据被删除了,这个字段如何处理,比如CASCADE(级联操作,如果外键对应的那条数据删除了,那么这条数据也会被删除)/SET_NULL(设置为空,如果外键对应的那条数据被删除了,就把这个数据置为空,前提是要设置这个字段可以为空)/SET_DEFAULT(设置为默认值,如果外键对应的那条数据被删除了,就把这条数据置为你设置的默认值)。on_delete是引用的那张表影响当前的这张表。

查询条件:

对象.query可以查看这个对象翻译成SQL的语句,但是query只能被用在QuerySet对象上,不能用在普通的ORM模型上,因此如果查询是通过get来获取数据的,那么就不能使用query,因为’get’返回的是满足条件的ORM模型,而不是QuerySet。如果是通过filter等其他返回QuerySet的方法查询的,就可以使用query。
在linux下utf8_general_ci是默认的排序规则,这个排序大小写不敏感,utf8_bin大小写敏感,windows下无论是哪种排序规则都大小写不敏感。
1.exact:使用精确地=进行查询,如果提供的是一个None,那么在SQL层面就被解释为NULL。SQL:select … from … where … = …;由于’field_exact=xxx’等价于’field=xxx’,所以不是很常用。
2.iexact:使用like进行查找,SQL:select…from …where … like …
3.contains:大小写敏感,判断某个字段是否包含了某个数据。在翻译成SQL语句的时候会使用like binary,而like binary就是大小写敏感的。
4.icontains:大小写不敏感,在被翻译成SQL的时候翻译为like。
contains和icontaions在被翻译成SQL的失败后使用的是%value%,就是只要整个字符串中出现了value就都能被找到。而iexact没有百分还,那么意味着只有完全不相等的时候才会被配到。

聚合函数

在这里插入图片描述
Mate完成指定数据库名字的工作。
所有的聚合函数都是放在django.db.models下面;聚合函数不能够单独的执行,需要放在一些可以之星聚合函数的方法下面,比如aggregate;聚合函数执行完后,会自动取名field__聚合函数的名字为默认名,想要使用自定义的名字可以在使用聚合函数的时候给对象命名,如a.objects.aggergate(my_avg=Avg('price));aggergate不会返回一个QuerySet,而是返回一个字典类型的对象,key是稽核函数的名字,value是执行后的result。

1.avg:求平均值。返回类型float
2.count:求个数,返回类型int。 有一个可选的参数:distinct 如果distinct=True,Count 将只计算唯一的实例。 它等同于COUNT(DISTINCT ) SQL 语句。默认值为False。
3.max/min求最大最小值。
4.StdDev:返回类型:float有一个可选的参数:sample 默认情况下,StdDev 返回群体的标准差。但是,如果sample=True,返回的值将是样本的标准差。SQLite 没有直接提供StdDev。
5.Variance:计算方差;返回的类型:float,有一个可选的参数:sample,默认情况下,Variance 返回群体的方差。但是,如果sample=True,返回的值将是样本的方差。SQLite 没有直接提供Variance。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值