目标
- MySQL 相关软件
- 操作数据库
- ORM模型
- 模型常用字段
- 外键和表关系
- 查询操作
- QuerySet API
- ORM练习
- ORM模型迁移
- Pycharm 配置连接数据库
一 MySQL 相关软件
1-1 MySQL 数据库
在 站开发中,数据库是 站的重要组成部分。只有提供数据库,数据才能够动态的展示,而不是在 页中显示一个静态的页面。数据库有很多,比如有SQL Server
、Oracle
、PostgreSQL
以及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
封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的MySQL
、PostgreSQL
和SQLite
。可以非常轻松的切换数据库。

3-2 创建ORM模型
1、ORM
模型一般都是放在app
的models.py
文件中。每个app
都可以拥有自己的模型。并且如果这个模型想要映射到数据库中,那么这个app
必须要放在settings.py
的INSTALLED_APP
中进行安装。以下是写一个简单的书籍ORM
模型。示例代码如下:
3-3 映射模型到数据库中
1、将ORM
模型映射到数据库中,总结起来就是以下几步:
- 在
settings.py
中,配置好DATABASES,做好数据库相关的配置。 - 在
app
中的models.py
中定义好模型,这个模型必须继承自django.db.models
。 - 将这个
app
添加到settings.py
的INSTALLED_APP
中。
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
。
- auto_now:在每次这个数据保存的时候,都使用当前的时间。比如作为一个记录修改日期的字段,可以将这个属性设置为
- DateTimeField:日期时间类型,类似于
DateField
。不仅仅可以存储日期,还可以存储时间。映射到数据库中是datetime
类型。这个Field
也可以使用auto_now
和auto_now_add
两个属性。 - TimeField:时间类型。在数据库中是
time
类型。在Python
中是datetime.time
类型。 - EmailField:类似于
CharField
。在数据库底层也是一个varchar
类型。最大长度是254个字符。 - FileField:用来存储文件的。这个请参考后面的文件上传章节部分。
- ImageField:用来存储图片文件的。这个请参考后面的图片上传章节部分。
- FloatField:浮点类型。映射到数据库中是
float
类型。 - TextField:大量的文本类型。映射到数据库中是longtext类型。
- UUIDField:只能存储
uuid
格式的字符串。uuid
是一个32位的全球唯一的字符串,一般用来作为主键。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!