orm字段关系映射,哪些框架实现了orm
ORM是什么?
ORM是MVC框架的重要组成部分,它实现了数据模型和数据库的解耦,即数据模型不需要依赖于某个特定的数据库,数据库可以通过简单的配置轻松替换。
ORM是对象关系映射的缩写。其主要任务是:
根据对象的类型生成表格结构。
将对象和列表操作转换成SQL语句(或其他数据库的语句)
将SQL查询的结果转换成对象和列表。
类名对应-数据库中的表名
数据库中的类别对应字段。
类别对应-数据库表中的一行数据。
ORM的优势:
ORM让我们常见的数据库交互变得简单易行,根本不用考虑那该死的SQL语句。快速发展,由此而来。
它可以避免一些程编写sql语句的新手所带来的性能问题。
如果数据库被迁移,你只需要替换Django的数据库引擎。
ORM的缺点:
牺牲了性能,但是现在各种ORM框架都在尝试各种方法,比如缓存,延迟加载,来缓解这个问题。效果显著。
对于个别复杂的查询,ORM仍然无法做到。为了解决这个问题,ORM一般支持编写原始sql。
通过QuerySet的查询属性查询对应操作的sql语句
数据库的配置
1.默认支持
Django默认支持sqlite,mysql,oracle,postgresql数据库。默认使用sqlite的数据库,默认使用sqlite的数据库驱动。引擎名为django.db.backends.sqlite3
2.mysql驱动
mysdb(MySQL Python)[Python 2中的驱动程序]
mysqlclient
关系型数据库
Pymysql(纯python的mysql驱动程序)[python 3中的驱动程序]
3.创建数据库
必须在配置前创建数据库。
一个
创建数据库Django _ books charset utf8#创建一个支持中文的数据库
4.更改项目中settings.py的数据库设置。
查看代码
5.配置驱动程序
Django默认导入的驱动是MySQLdb,对python3的支持有很大问题,应该在__init__中改成PyMySQL:项目名称文件夹下的py:
一个
2
导入pymysql
告诉Django使用Pymysql驱动程序
扩展:查看ORM操作执行的原生sql语句,并在settings.py中添加以下内容:
查看代码
表(模型)的创建
例子:作者、书籍和出版商之间的关系
查看代码
1.每个数据模型(类)都是django.db.models.Model的子类,其父模型包含了所有与数据库交互的必要方法。
2.每个类相当于单个数据表,属性名就是字段名。
字段类型介绍
查看代码
3.字段参数介绍
查看代码
4.模型之间的关系(表之间)
有三种关系:一对一、一对多和多对多
一对一:本质是在master和foreign key关系的基础上,给foreign key增加一个UNIQUE=True属性;一对一(“用户组”)
一对多:是主键-外键关系;ForeignKeyField(UserGroup ,to_field=gid ,default=1,on_delete=models。级联)
多对多:ORM会自动为我们创建第三个表(当然我们也可以自己创建第三个表:两个外键););ManyToManyField(“用户组”)
参数:“用户组”thdyc的另一个表的表名;
可以省略To_field=gid。默认情况下,另一个表的字段是主键;
On _ delete=模型。没有这个级联将报告一个错误;
5.构建完表后,在命令行上执行两条语句来生成映射文件,并将其提交给数据库来构建表。
一个
2
Python manage.py makemigrations在应用程序文件夹中生成映射文件(以000开头的py文件)。
Python manage.py migrate提交数据库以执行表构建。
6.修改数据表
如果您想要修改数据模型并重新执行步骤5,可能会出现以下问题:
如果新增的字段没有默认值,或者原表中设置的字段不能为空,这里有两种选择:1、设置默认值,2、退出修改。选择1后,输入默认值即可。
桌子的操作
一.补充
添加表格记录
查看代码
添加多对多之间的关系
查看代码
二。删除
删除表格记录
一个
book . objects . filter(name= python )。delete () #看似删除了一条消息,实际上删除的是book_author表中的数据,这是django默认的级联删除。
删除多对多之间的关系
查看代码
三。修订本
修改表格数据
查看代码
要修改多对多表之间的关系:
一个
没有什么特殊的方法可以将remove()和add()结合起来。
四。打听
1.查询API:
查看代码
扩展查询:有时候Django的查询API无法方便的设置查询条件,提供了另一种扩展查询方法extra()。
查看代码
单表模糊查询:(双下划线)
查看代码
2.多表thdyc查询:(多对多和一对多没有区别)
查看代码
3.3的惯性机制。查询
所谓惯性机制,models查询语句只返回一个Queryset对象,并不立即执行SQL,只是在使用查询结果时才执行。
例如,句子:person _ set=person . objects . filter(first _ name= Dave )不运行数据库查询,该查询仅在遍历Queryset、if queryset或呈现模板时执行。
查询集的特点:迭代、切片和缓存。
Queryset已缓存。
当遍历Queryset时,从数据库中检索匹配的记录,然后转换成Django的模型。这些模型会存储在Queryset的内置缓存中,如果再次遍历或使用这个Queryset,就不需要重复查询了。
但是,如果处理数千条记录,一次性加载内存是非常浪费的。为了避免Queryset缓存,可以使用iterator()方法获取数据,处理后丢弃。
查看代码
迭代器不能迭代,这意味着可能会导致额外的重复查询。而缓存用于减少对数据库的查询。所以使用的时候要考虑需求。
4.聚合查询的分组查询
从django.db.models导入平均值、最小值、总和、最大值、计数
查询:aggregate(*args,**kwargs):
Aggregate()是Queryset的终止子句。通过计算Queryset,它返回聚合值的字典。从整个查询集生成聚合值。
aggregate()子句的参数描述了我们要计算的聚合值,如average Avg、Sum sum等。
例如:
查看代码
查询:Annotate(www.thd540.com * args,* *夸尔格斯):
分组查询通常伴随着聚合查询。它可以为查询集的每个项目生成聚合。
查看代码
5.f查询和Q查询
从django.db.models导入F,Q
查询:是用来更新原始值的函数。
模特。author . objects . all(www . tianzun yule 178 . com/)。Update (age=f (age) 1) #将所有人的年龄放入作者表1中
Models.book.objects.all()。Update (price=f (price) 10) #所有图书涨价10元
q:用于构造复杂的查询条件,比如AND,OR,NOT。
我们可以使用filter()方法来查询条件。filter()中两个条件之间的关系是and。如果是或者,就只能用Q查询了。
book . objects . filter(Q(ID=www . tygj 178 . com 1))#查询条件为id=1
book . objects . filter(Q(price=www . dfg jpt . com 99) ~ Q(name= Python )#查询price=99或name不等于Python的图书
book . objects . filter(Q(name=www . dfgj 157 . com go ),price=99) # Q查询可以和关键字查询结合使用,但是必须把Q放在前面。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。