Django学习笔记(3)--数据库-1

数据库:MySql 5.7html

下载:python

https://dev.mysql.com/downloads/windows/installer/5.7.html

python安装Mysql的驱动mysql

pip install mysqlclient

固然除此以外还有pymysql等第三方驱动可使用,在这里用的是mysqlclient。web

操做数据库sql

Django配置链接数据库:数据库

在操做数据库以前,首先先要链接数据库。这里咱们以配置MySQL为例。Django链接数据库,不须要单独的建立一个链接对象。只须要在settings.py文件中作好数据库相关的配置就能够了。示例:django

DATABASES = {
    'default':{
        #数据库引擎
        'ENGINE': 'django.db.backends.mysql',
        #数据库名字
        'NAME': 'name',
        #链接数据库的用户名
        'USER': 'username',
        #用户密码
        'PASSWORD': '********',
        #mysql的主机地址
        'HOST': 'ip_address',
        #端口
        'PORT': 'port'
    }
}

 在Django操做数据库:windows

操做方式有两种:api

  1. 原生sql语句
  2. ORM模型

1.原生sql语句安全

在Django中使用原生的sql语句操做其实就是使用python ad api的接口来操做。若是使用的是mysqlclient驱动,那么就是用mysqlclient来操做的,只不过Django将数据库链接这一部分封装好了,咱们只要在settings.py中配置好了数据库链接信息后直接使用Django封装好的接口就能够操做了。示例:

#使用django封装好的connection对象,会自动选取settings.py中数据库的配置信息
from django.db import connection

#获取游标对象
cursor = connection.cursor()
#拿到游标对象后执行sql语句
cursor.execute("select * from book")
#获取全部数据
rows = cursor.fetchall()
#遍历查询到的数据
for row in rows:
    print(row)

附:Python DB API 规范下cursor对象经常使用接口:

1.description:若是cursor执行了查询的sql代码,那么读取cursor.description属性的时候,将返回一个列表,这个列表中装的是元组,元组中装的分别是(name,type_code,display_size,internal_size,precision,scale,null_ok),其中name表明的是查询出来的元素的字段名称,其余参数暂时用处不大。

2.rowcount:表明的是在执行了sql语句后受影响的行数。

3.close:关闭游标。关闭游标之后就不能使用了,不然会抛出异常。

4.execute(sql[,parameters]):执行某个sql语句。若是在执行sql语句的时候还须要传递参数,那么能够传给parameters参数。示例:

cursor.execute("select * from article where id=%s",(1,))

5.fetchone:在执行了查询操做后,获取第一条数据

6.fetchmany(size):获取多条查询到的数据

7.fetchall:获取全部查询到的数据

2.ORM模型

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

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

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

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

 

 

 

 

 

ORM模型的建立和映射:

1.建立ORM模型:

‘ORM’模型通常都是放在'app'的'models.py'文件中,每一个'app'均可以拥有本身的模型,而且若是这个模型想要映射到数据库中,那么这个'app'必需要放在'settings.py'的'INSTALLED_APP'中进行安装,如下是写一个简单的数据'ORM'模型。示例:

from django.db import models class Book(models.Model): name=models.CharField(max_length=20,null=False) author=models.CharField(max_length=20,null=False) pub_time=models.DateTimeField(default=datetime.now) price=models.FloatField(default=0)

以上便定义了一个模型。这个模型继承自'django.db.models.Model',若是这个模型想要映射到数据库中,就必须继承自这个类,这个模型之后映射到数据库中,表名是模型名称的小写形式,为'book'。在这个表中,有四个字段,一个为'name',这个字段是保存的是书的名称,是'varchar'类型,最长不能超过20个字符,而且不能为空。第二个字段是……

若是没有定义主键,那么将会自动生成一个自动增加的'int'类型的主键,而且这个主键的名字叫作'id'。

 

2.映射模型到数据库中:

将'ORM'模型映射到数据库中,总结起来有如下几步:

1.在'settings.py'文件中,配置好'DATABASES',作好数据库相关配置。

2.在'app'中的'models.py'中定义好魔性,这个模型必须继承自'django.db.models'。

3.将这个'app'添加到'settings.py'中的'INSTALLED_APP'中。

4.在终端进入项目所在路径,而后执行'python manage.py makemigrations'来生成迁移脚本文件。

5.接着执行'python manage.py migrate'来迁移脚本文件映射到数据库中。

 

 

 

 

 

 

 

 

ORM模型基本增删改查操做

1.添加数据:

只要使用ORM模型建立一个对象,而后再调用这个ORM模型的'save'方法就能够保存了。

示例:

book = Book(name='西游记',author='吴承恩',price=100)
book.save()

2.查找数据:

全部的查找工做都是使用模型上的'objects'属性来完成的,固然也能够试用自定义查询对象.

1.根据主键进行查找:使用主键进行查找,能够试用'objects.get'方法,而后传递'pk=xx'的方式进行查找。示例:

book = Book.objects.get(pk=2)

2.根据其余字段进行查找:可使用'objects.filter'方法进行查找。示例:

book = Book.objects.filter(name='三国演义')

使用'filter'方法返回来的是一个'QuerySet'对象。这个对象相似于列表。咱们可使用这个对象的'first'方法来获取第一个值。

3.删除数据:

首先查找到对应的数据模型。而后再执行这个模型的'delete'方法便可。示例:

book = Book.objects.get(pk=1)
book.delete()

4.修改数据:

首先查找到对应的数据模型。而后修改这个模型上的属性的值。再执行'save'方法便可修改完成。示例:

book = Book.objects.get(pk=2)
book.price=200
book.save()

 

 

 

 

 

 

 

 

模型经常使用属性

经常使用字段:

在Django中,定义了一些Field来与数据库表中的字段类型来进行映射。

  • AutoField:

映射到数据库中是int类型,能够由自动增加的特性。通常不须要使用这个类型,若是不指定主键,那么模型就会自动生成一个叫id的自动增加的主键。若是你想指定一个其它名字的而且具备自动增加的主键,使用AutoField也是能够的(primary_key=True)。

  • BigAutoField:

64位的整型,相似于AutoField,只不过是产生的数据范围是从1-9223372036854775807

  • BooleanField:

在模型层接收的是True/False。在数据库层面是tinyint类型。若是没有指定默认值,默认值是None。

  • CharField:

在数据库层面是varchar类型。在python层面就是普通的字符串。这个类型在使用的时候必需要指定最大的长度,也即必需要传递max_length这个关键字参数进去。

  • DateField:

日期类型。在python中是datetime.date类型,能够记录年月日。在映射到数据库中也是date类型,使用这个Field能够传递一下几个参数:

  1. aotu_now:在每次这个数据库保存的时候,都是用当前的时间。若是做为一个记录修改日期的字段,能够将这个属性设置为True。
  2. auto_now_add:在每次数据第一次被添加进去的时候,都是用当前的时间。好比做为一个记录第一次入库的字段,能够将这个属性设置为True。
  • DateTimeField:

日期时间类型,相似于DateField。不只仅能够存储日期,还能够存储时间。映射到数据库中是datetime类型。这个Field也可使用auto_now和auto_now_add两个属性。

  • TimeField:

时间类型。在数据库中是time类型。在Python中是datetime.time类型。

  • EmailField:

相似于CharField。在数据库底层也是一个varchar类型。只不过这个Field能够存储字符串的时候检测这个字符串是不是一个有效的邮箱。最大长度是254个字符。

  • FileField:

用来存储文件的。(待补充)

  • ImageField:

用来存储图片文件。(待补充)

  • FloatField:

浮点类型。映射到数据库中是float类型。

  • IntegerField:

整型。-2147483647~2147483647

  • BigIntegerField:

大整型。

  • PositiveIntegerField:

正整型。0~2147483647

  • SmallIntegerFlied:

小整型。-32768~32768

  • TextField:

大量的文本类型。映射到数据库中是longtext类型。

  • UUIDField:

只能存储uuid格式的字符串。uuid是一个32位的全球惟一的字符串,通常用来做为主键。

  • URLField:

相似于CharField,只不过只能用来存储url格式的字符串。默认max_length是200。

相关文章
相关标签/搜索