|
#前言:关于Django我在此片博客之前已经发布了六篇博客,感兴趣的可以在主页查看学习与交流。此篇博客我会讲解在Django中数据库的一些操作,如若各位大佬发现错误或者需要添加的内容,欢迎各位指正,最后我后续还会继续更新关于Django的一些基本内容,欢迎大家关注。一、数据库及其在开发中的地位介绍:关于数据库,最简单最浅显的认知就是它是用来存储数据和管理数据的一门学科,但是关于数据库的认知可不止如此。1.数据库系统(DBS):从广义上来讲数据库系统它由四部分组成,分别是数据库、硬件、软件、人员组成。而数据库系统它是采用了数据库技术,有组织地、动态的存储大量数据,方便用户访问的计算机系统。注意:数据库属于数据库系统。1、数据库:数据库是统一管理的、长期储存在计算机内的、有组织的相关数据的集合。其特点是数据间联系密切、冗余度小、独立性较高、易扩展,并且可为各类用户共享。2、硬件:硬件是构成计算机系统的各种物理设备,包括存储数据所需的外部设备。硬件的配置应满足整个数据库系统的需要。3、软件:软件包括操作系统、数据库管理系统及应用程序。其中数据库管理系统是最为重要的一个点,也是数据库这门学科中的核心内容。数据库管理系统它是数据库系统的核心软件,需要在操作系统的支持下工作,解决如何科学地组织和储存数据。4、人员:人员主要有4类。第一类为系统分析员和数据库设计人员,系统分析员负责成用系统的需求分析和规范说明,他们和用户及数据库管理员一起确定系统的硬件配置,并参数据库系统的概要设计。第一类为应用程序员,负责编写使用数据库的应用程序,这些应用程序可对数据进行检索、建立、删除或修改。第三类为最终用户,他们应用系统的接口或利用查询语言访问数据库。第类用户是数据库管理员(DataBaseAdministrator,DBA),负责数据库的总体信息控制。2.数据库系统的体系结构:数据库系统是数据密集型应用的核心,其体系结构受数据库运行所在的计算机系统的影响很大,尤其是受计算机体系结构中的连网、并行和分布的影响。从不同的角度或不同层次上看数据库系统体系结构不同;从最终用户的角度看,数据库系统体系结构分为集中式)分布式C/S(客户端/服务器)和并行结构。1.集中式数据库系统:在这种系统中,不仅数据是集中的,数据的管理也是集中的,数据库系统的所有功能(从形式的用户接口到DBMS核心)都集中在DBMS所在的计算机上,如下图所示。大多数关系DBMS的产品也是从这种系统结构开始发展的,目前这种系统还在使用。2.客户端/服务器结构(C/S):这种结构非常重要,它就是体现数据库在前后端中作用最好的实例。很多现代软件都采用客户端/服务器体系结构,如下图所示。在这种结构中,一个处理机(客户端)的请求被送到另一个处理机(服务器)上执行。其主要特点是客户端与服务器CPU之间的职责明确,客户端主要负责数据表示服务,服务器主要负责数据库服务。采用客户端/服务器结构后,数据库系统功能分为前端和后端。前端主要包括图形用户界面、表格生成和报表处理等工具;后端负责存取结构、查询计算和优化、并发控制以及故障恢复等。前端与后端通过SQL或应用程序来接口。3.并行数据库系统:并行体系结构的数据库系统是多个物理上连在一起的CPU)而分布式系统是多个地理上分开的CPÙ。4.分布式数据库系统:分布式DBMS包括物理上分布,逻辑上集中的分布式数据库结构和物理上分布、逻辑上布的分布式数据库结构两种。上述主要从介绍了数据库系统的角度来介绍了数据库在实际开发中的地位。二、数据库在Django中的实际应用:以Mysql为实例:1、ORM:ORM是django提供的内置框架,是和一些关系型数据库的连接接口,使用类对象的方式操作数据(增删改查)。ORM将类对象的操作语句转换为SQL语句,接着进入到数据库中获取结果,最后将结果转为对象的格式返回。模型是项目的数据来源,模型类映射到数据库中的表,模型类中的每一个属性相当于表中的字段。在Django中配置MySQL数据库,先在MySQL中创建好数据库(空)【一个数据库只能连接一个项目】。在数据库自己已经创建好的Django文件中找到setting.py文件,找到DATABASE:DATABASES={'default':{'ENGINE':'django.db.backends.mysql',#配置数据库引擎'HOST':'127.0.0.1',#主机'USER':'root',#数据库没创建前一般叫root(用户名)'PASSWORD':'',#自己数据库的密码#配置连接对数据库,数据库在连接前必须被创建好'NAME':'orm_13',#自己数据库的名字}}'运行运行2、模型类:关于模型类主要包括三大操作:定义模型类、数据迁移、通过类对象进行操作数据。1.定义模型类:定义模型类,模型类都必须继承Model类。模型类定义在应用中的models文件。fromdjango.dbimportmodelsclassStudent(models.Model):#定义属性,数据表中的字段#namechar(10)#CharField定义字符串字段,这个类型字段必须定义最大长度#max_length定义字段的最大长度name=models.CharField(max_length=10)#ageint()#IntegerField定义整型字段age=models.IntegerField()#heightfloat/double(3,2)#DecimalField定义浮点类型#max_digits浮点型的数据长度#decimal_places浮点型小数位数height=models.DecimalField(max_digits=3,decimal_places=2)#genderenum('男','女')#设置选择字段的选项值gender_choices=(#(选项字符,选项内容)('1','女'),('2','男'),)gender=models.CharField(choices=gender_choices,max_length=1)上述代码主要介绍的就是定义模型类的方法,其中关于整形、浮点型或者字符型是啥,或者其它类型怎么表示,我在下面列一个表:字段类型:字段类型说明AutoField自动增量,32位整数。取值:1~(2^31)-1BigAutoField自动增量,64位整数。取值:1~(2^63)-1BigIntegerField64位整数。取值:-2^63~(2^63)-1。字段默认表单控件为TextInputBinaryField存储原始的二进制数据BooleanField存储True或者False,字段默认表单控件为CheckboxInputCharField存储字符串。字段默认表单控件为TextInputDateField存储日期,字段值为datetime.date实例。字段默认表单控件为TextInput;参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False;参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总使用当前日期,默认为False;参数auto_now_add和auto_now是相互排斥的,组合将会发生错误.DateTimeField存储日期时间,字段值为datetime.datetime实例。字段默认表单控件为TextInputDecimalField存储固定精度的十进制数字段,字段值为Decimal实例。字段默认表单控件为NumberInput;参数max__digits表示总位数,参数decimal__places表示小数位数DurationField存储时间段EmailField存储E-mail地址FileField存储文件,字段默认表单控件为ClearableFileInputFilePathField存储文件路径FloatField存储浮点数。字段默认表单控件为NumberInputImageField存储图片。字段默认表单控件为ClearableFileInputIntegerField存储整数。取值:-2^31~(2^31)-1GenericIPAdderssField存储字符串格式的IPv4或者IPv6地址。字段默认表单控件为TextInputPositiveIntegerField存储非负整数,取值:0~(2^31)-1PositiveSmallIntegerField存储非负小整数。取值:0~(2^15)-1SmallIntegerField存储小整数,取值范围-2^15~(2^15)-1TextField存储大量文本。字段默认表单控件为TextareaTimeField存储时间。字段值为datetime.time实例,字段默认表单控件为TextInputURLField存储URL。字段默认表单控件为TextInputSlugField存储Slug数据,只包含字母、数字、下换线或连字符而其它细节在代码中的注释中都有提及。2.数据迁移:定义好模型类之后,必须进行数据迁移,数据库中才能同步到对应的数据表。数据迁移要在项目的终端操作,在manage.py的同级目录下操作。然后输入:pythonmanage.pymakemigrations3.数据同步:执行migrate命令,将模型类同步到数据库中。同上在上述操作后继续在终端输入:pythonmanage.pymigrate4.注意:1.在定义模型类的时候没有给其定义数据表的表名,在迁移同步到数据库中之后,这个表的表名会默认设置为:应用名_模型类名。2.只要操作到models.py文件中的内容,就必须执行数据迁移和数据同步两个操作。迁移过了之后增加字段,必须给新增的字段设置默认值,或者允许为空【null设置是否允许为空(True/False),default设置默认值】ORM在执行迁移数据的时候,会自动生成一个为主键且自增的id字段。同时应该设置在数据库中的表名:(注意它是同属于模型类之下的)classMeta:#设置在数据库中的表名db_table='student'#以student为例子'运行运行如果发生迁移报错的问题如何解决,我在上一篇博客中已经做了详细介绍,有兴趣的可以点击它直达:Pycharm中使用mysqlclient(Django)-CSDN博客。3、数据操作:1、使用raw方法操作原始SQL:fromOrmApp1.modelsimportStudent#增加数据sql="insertintostudent(name,age,height,gender,weight)values"\"('陈一',18,1.65,'2',98.2),('刘二',19,1.75,'2',178.2)"#将sql语句交给raw方法执行#通过模型类对象的方式进行操作add_data=Student.objects.raw(sql)#对这个操作的返回值对象进行提交(增删改)add_data.query._execute_query()#修改数据sql="updatestudentsetage=20whereid=2"update_data=Student.objects.raw(sql)update_data.query._execute_query()#删除数据sql='deletefromstudentwhereid=1'delete_data=Student.objects.raw(sql)delete_data.query._execute_query()#查询数据sql="select*fromstudent"#RawQuerySet数据查询集,是一个对象data=Student.objects.raw(sql)print(data)#获取对象中的某个数据,需要使用循环foriindata:#获取到选项字段的具体数据:对象.get_字段名_display()print(i.name,i.age,i.get_gender_display())上述代码中就是用raw方法来操作增删改查SQL数据,具体细节在代码的注释中。2、直接执行原始的SQL语句:与pymysql操作类似:fromdjango.dbimportconnection#创建游标cursor=connection.cursor()sql="insertintostudent(name,age,height,gender,weight)values"\"('陈一',18,1.65,'2',98.2)"cursor.execute(sql)sql="select*fromstudent"cursor.execute(sql)data=cursor.fetchall()print(data)3、使用django提供的模型方法:#添加数据#方式一:会有返回值,是一个数据对象add_data=Student.objects.create(name='张三',age=25,height=1.55,gender='1',weight=102.3)print(add_data)#方式二:这种方式添加数据必须执行保存的方法data=Student(name='李四',age=35,height=1.85,gender='2',weight=162.3)data.save()#查询数据#all查询表中的所有数据data=Student.objects.all()#QuerySet返回一个查询集对象print(data)fordindata:print(d.name,d.age,d.get_gender_display())print('='*20)#filter相当于where子句data=Student.objects.filter(gender='2')fordindata:print(d.name,d.age,d.get_gender_display())4、字段选项(总结):选项说明Null默认为False。为True时,Django在字段没有数据时将空值NULL存储数据库(字符串字段存储空字符串)blank默认为False。为True时,字段允许为空,即表单验证允许输入空值。blank影响数据验证,null影响数据库数据存储choices为字段定义选择项。字段值为选项中的列表或者元组的值db_column定义字段在数据库表中的列名称,为设置时,Django用模型中的字段名作为数据库表的列名称db_index为True时,为该字段创建数据库索引db_tablespace若为字段创建了索引,则为字段索引设置数据库的表空间名称default设置字段默认值editable默认是True。为False时,字段不在模型表单中显示error_messages设置错误提示信息。该设置会覆盖默认的错误提示信息help_text设置字段的帮助信息primary_key设置为True时,字段成为模型的主键unique设置为True时,字段值在整个表中必须是唯一的unique_for_date设置日期或者日期时间字段名,关联的两个字段值在整个表中必须是唯一的unique_for_month类似unique_for_date。与关联的月份唯一unique_for_year类似unique_for_date。与关联的年份唯一verbose_name为字段设置备注名称validators为字段设置校验器5、字段查找类型(总结):查找类型说明exact完全符合。例如:question_exact='text'等同于wherequestion='text'iexact与exact类似,但不区分字母大小写contains包含,区分字母大小写。例如question_contains='text'等同于wherequestionlike'%text%'icontains包含,不区分字母大小写in在指定项中进行匹配。例如id_in=[3,5]等同于whereidin(3,5),表达式可以是列表、元组、字符串、也可以是filter()、exclude()和get()等方法返回的包含当个字段值的查询集(QuerySet)gt大于。例如id_gt=3等同于whereid>3gte大于等于。例如id_gte=3等同于whereid>=3lt小于。例如id_lt=3等同于whereid
|
|