数据库

目标

  • MySQL 相关软件
  • 操作数据库
  • ORM模型
  • 模型常用字段
  • 外键和表关系
  • 查询操作
  • QuerySet API
  • ORM练习
  • ORM模型迁移
  • Pycharm 配置连接数据库

 

一 MySQL 相关软件

1-1 MySQL 数据库

  在网站开发中,数据库是网站的重要组成部分。只有提供数据库,数据才能够动态的展示,而不是在网页中显示一个静态的页面。数据库有很多,比如有SQL ServerOraclePostgreSQL以及MySQL等等。MySQL由于价格实惠简单易用不受平台限制灵活度高等特性,目前已经取得了绝大多数的市场份额。因此我们在Django中,也是使用MySQL来作为数据存储。

MySQL数据库安装 

1)在MySQL的官网下载MySQL数据库安装文件:https://dev.mysql.com/downloads/windows/installer/5.7.html

2)然后双击安装,如果出现以下错误,则到http://www.microsoft.com/en-us/download/details.aspxd=17113下载.net framework

数据库

4)接下来就是做好用户名和密码的配置即可。

navicat数据库操作软件 

  安装完MySQL数据库以后,就可以使用MySQL提供的终端客户端软件来操作数据库。如下:

数据库

MySQL驱动程序安装

  我们使用Django来操作MySQL,实际上底层还是通过Python来操作的。因此我们想要用Django来操作MySQL,首先还是需要安装一个驱动程序。在Python3中,驱动程序有多种选择。比如有pymysql以及mysqlclient等。这里我们就使用mysqlclient来操作。mysqlclient安装非常简单。只需要通过pip install mysqlclient即可安装。

常见MySQL驱动介绍:

  • MySQL-python:也就是MySQLdb。是对C语言操作MySQL数据库的一个简单封装。遵循了Python DB API v2。但是只支持Python2,目前还不支持Python3
  • mysqlclient:是MySQL-python的另外一个分支。支持Python3并且修复了一些bug
  • pymsql:Python实现的一个驱动。因为是纯Python编写的,因此执行效率不如MySQL-python。并且也因为是纯Python编写的,因此可以和Python代码无缝衔接。
  • MySQL Connector/Python:MySQL官方推出的使用纯Python连接MySQL的驱动。因为是纯Python开发的。效率不高。

 

二 操作数据库

2-1 Django配置连接数据库

  在操作数据库之前,首先先要连接数据库。这里我们以配置MySQL为例来讲解。Django连接数据库,不需要单独的创建一个连接对象。只需要在settings.py文件中做好数据库相关的配置就可以了。示例代码如下:

 

2-2 在Django中操作数据库

1、在Django中操作数据库有两种方式。第一种方式就是使用原生sql语句操作,第二种就是使用ORM模型来操作。这节课首先来讲下第一种。

2、在Django中使用原生sql语句操作其实就是使用python db api的接口来操作。如果你的mysql驱动使用的是pymysql,那么你就是使用pymysql来操作的,只不过Django将数据库连接的这一部分封装好了,我们只要在settings.py中配置好了数据库连接信息后直接使用Django封装好的接口就可以操作了。示例代码如下:

  以上的execute以及fetchall方法都是Python DB API规范中定义好的。任何使用Python来操作MySQL的驱动程序都应该遵循这个规范。所以不管是使用pymysql或者是mysqlclient或者是mysqldb,他们的接口都是一样的。更多规范请参考:https://www.python.org/dev/peps/pep-0249/

 

2-3 Python DB API下规范下cursor对象常用接口

  • description:如果cursor执行了查询的sql代码。那么读取cursor.description属性的时候,将返回一个列表,这个列表中装的是元组,元组中装的分别是(name,type_code,display_size,internal_size,precision,scale,null_ok),其中name代表的是查找出来的数据的字段名称,其他参数暂时用处不大。
  • rowcount:代表的是在执行了sql语句后受影响的行数。
  • close:关闭游标。关闭游标以后就再也不能使用了,否则会抛出异常。
  • execute(sql[,parameters]):执行某个sql语句。如果在执行sql语句的时候还需要传递参数,那么可以传给parameters参数。示例代码如下:
  • fetchone:在执行了查询操作以后,获取第一条数据
  • fetchmany(size):在执行查询操作以后,获取多条数据。具体是多少条要看传的size参数。如果不传size参数,那么默认是获取第一条数据。
  • fetchall:获取所有满足sql语句的数据。

 

三 ORM 模型

3-1 ORM模型介绍

1、随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了:

  • SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。
  • 很多SQL语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些SQL语句的修改。
  • 写SQL时容易忽略web安全问题,给未来造成隐患。SQL注入。

2、ORM,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性,ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。使用ORM有许多优点:

  • 易用性:使用ORM做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰
  • 性能损耗小:ORM转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。
  • 设计灵活:可以轻松的写出复杂的查询。
  • 可移植性:Django封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的MySQLPostgreSQLSQLite。可以非常轻松的切换数据库。

数据库

 

3-2 创建ORM模型

1、ORM模型一般都是放在appmodels.py文件中。每个app都可以拥有自己的模型。并且如果这个模型想要映射到数据库中,那么这个app必须要放在settings.pyINSTALLED_APP中进行安装。以下是写一个简单的书籍ORM模型。示例代码如下:

  以上便定义了一个模型。这个模型继承自django.db.models.Model,如果这个模型想要映射到数据库中,就必须继承自这个类。这个模型以后映射到数据库中,表名是模型名称的小写形式,为book。在这个表中,有四个字段,一个为name,这个字段是保存的是书的名称,是varchar类型,最长不能超过20个字符,并且不能为空。第二个字段是作者名字类型,同样也是varchar类型,长度不能超过20个。第三个是出版时间,数据类型是datetime类型,默认是保存这本书籍的时间。第五个是这本书的价格,是浮点类型。
  还有一个字段我们没有写,就是主键id,在django中,如果一个模型没有定义主键,那么将会自动生成一个自动增长的int类型的主键,并且这个主键的名字就叫做id

 

3-3 映射模型到数据库中

1、将ORM模型映射到数据库中,总结起来就是以下几步: 

  • settings.py中,配置好DATABASES,做好数据库相关的配置。 
  • app中的models.py中定义好模型,这个模型必须继承自django.db.models
  • 将这个app添加到settings.pyINSTALLED_APP中。 
  • 在命令行终端,进入到项目所在的路径,然后执行命令python manage.py makemigrations生成迁移脚本文件。 
  • 同样在命令行中,执行命令python manage.py migrate来将迁移脚本文件映射到数据库中

 

3-4模型中 Meta 配置

1、对于一些模型级别的配置。我们可以在模型中定义一个类,叫做Meta。然后在这个类中添加一些类属性来控制模型的作用。比如我们想要在数据库映射的时候使用自己指定的表名,而不是使用模型的名称。那么我们可以在Meta类中添加一个db_table的属性。示例代码如下:

2、以下将对Meta类中的一些常用配置进行解释。

  • db_table:这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型名来作为默认的表名。
  • ordering:设置在提取数据的排序方式。后面章节会讲到如何查找数据。比如我想在查找数据的时候根据添加的时间排序,那么示例代码如下:

更多的配置请参考官方文档:https://docs.djangoproject.com/en/2.0/ref/models/options/

 

 

四 模型常用属性

1、常用字段:在Django中,定义了一些Field来与数据库表中的字段类型来进行映射。以下将介绍那些常用的字段类型。

  • AutoField:映射到数据库中是int类型,可以有自动增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做id的自动增长的主键。如果你想指定一个其他名字的并且具有自动增长的主键,使用AutoField也是可以的。
  • BigAutoField:64位的整型,类似于AutoField,只不过是产生的数据的范围是从1-9223372036854775807
  • IntegerField:整型。值的区间是-2147483648——2147483647
  • BigIntegerField:大整型。值的区间是-9223372036854775808——9223372036854775807
  • PositiveIntegerField:正整型。值的区间是0——2147483647
  • SmallIntegerField:小整型。值的区间是-32768——32767
  • PositiveSmallIntegerField:正小整型。值的区间是0——32767
  • BooleanField:在模型层面接收的是True/False。在数据库层面是tinyint类型。如果没有指定默认值,默认值是None
  • CharField:在数据库层面是varchar类型。在Python层面就是普通的字符串。这个类型在使用的时候必须要指定最大的长度,也即必须要传递max_length这个关键字参数进去。
  • DateField:日期类型。在Python中是datetime.date类型,可以记录年月日。在映射到数据库中也是date类型。使用这个Field可以传递以下几个参数: 
    • auto_now:在每次这个数据保存的时候,都使用当前的时间。比如作为一个记录修改日期的字段,可以将这个属性设置为True。 
    • auto_now_add:在每次数据第一次被添加进去的时候,都使用当前的时间。比如作为一个记录第一次入库的字段,可以将这个属性设置为True
  • DateTimeField:日期时间类型,类似于DateField。不仅仅可以存储日期,还可以存储时间。映射到数据库中是datetime类型。这个Field也可以使用auto_nowauto_now_add两个属性。 
  • TimeField:时间类型。在数据库中是time类型。在Python中是datetime.time类型。 
  • EmailField:类似于CharField。在数据库底层也是一个varchar类型。最大长度是254个字符
  • FileField:用来存储文件的。这个请参考后面的文件上传章节部分。
  • ImageField:用来存储图片文件的。这个请参考后面的图片上传章节部分。
  • FloatField:浮点类型。映射到数据库中是float类型。
  • TextField:大量的文本类型。映射到数据库中是longtext类型。
  • UUIDField:只能存储uuid格式的字符串uuid是一个32位的全球唯一的字符串,一般用来作为主键。
  • URLField:类似于CharField,只不过只能用来存储来源:weixin_30325793

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年2月17日
下一篇 2019年2月17日

相关推荐