中国建设银行复核网站,开发助手,店面设计薪酬,自媒体代运营怎么收费一、数据表操作
1. 数据新增
由模型实例化对象调用内置方法实现数据新增#xff0c;比如单数据新增调用create#xff0c;查询与新增调用get_or_create#xff0c;修改与新增调用update_or_create#xff0c;批量新增调用bulk_create。
1.1 create()
# 方法一
# 使用cr…一、数据表操作
1. 数据新增
由模型实例化对象调用内置方法实现数据新增比如单数据新增调用create查询与新增调用get_or_create修改与新增调用update_or_create批量新增调用bulk_create。
1.1 create()
# 方法一
# 使用create方法实现数据插入
Vocation.objects.create(job测试工程师,title系统测试,
payment0,name_id3)# 方法二
# 同样使用create方法但数据以字典格式表示
ddict(job测试工程师,title系统测试,payment0,name_id3)
Vocation.objects.create(**d)# 方法三
# 在实例化时直接设置属性值
vVocation(job测试工程师,title系统测试,payment0,name_id3)
v.save()注意 执行数据插入时为了保证数据的有效性我们需要对数据进行去重判断确保数据不会重复插入。以往的方案都是对数据表进行查询操作如果查询的数据不存在就执行数据插入操作。
1.2 get_or_create()
get_or_create根据每个模型字段的值与数据表的数据进行判断判断方式如下:
只要有一个模型字段的值与数据表的数据不相同除主键之外就会执行数据插入操作。如果每个模型字段的值与数据表的某行数据完全相同就不执行数据插入而是返回这行数据的数据对象。
ddict(job测试工程师,title系统测试,payment10,name_id3)
Vocation.objects.get_or_create(**d)1.3 update_or_create()
update_or_create方法判断当前数据在数据表里是否存在若存在则进行更新操作否则在数据表里新增数据。
# 第一次是新增数据
ddict(job软件工程师,titleJava开发,name_id2,payment8000)
vVocation.objects.update_or_create(**d)
# 第二次是修改数据
vVocation.objects.update_or_create(**d,defaults{title: Java})1.4 bulk_create()
如果要对某个模型执行数据批量插入操作那么可以使用bulk_create方法实现只需将数据对象以列表或元组的形式传入bulk_create方法即可。
v1Vocation(job财务,title会计,payment0,name_id1)
v2Vocation(job财务,title出纳,payment0,name_id1)
ojb_list [v1, v2]
Vocation.objects.bulk_create(ojb_list)2. 数据修改
数据修改必须执行一次数据查询再对查询结果进行修改操作常用方法有模型实例化、update方法和批量更新bulk_update。
2.1 模型实例化
v Vocation.objects.get(id1)
v.payment 20000
v.save()2.2 update()
# 批量更新一条或多条数据查询方法使用filter
# filter以列表格式返回查询结果可能是一条或多条数据
Vocation.objects.filter(job测试工程师).update(job测试员)
# 更新数据以字典格式表示
d dict(job测试员)
Vocation.objects.filter(job测试工程师).update(**d)
# 不使用查询方法默认对全表的数据进行更新
Vocation.objects.update(payment6666)
# 使用内置F方法实现数据的自增或自减
# F方法还可以在annotate或filter方法里使用
from django.db.models import F
vVocation.objects.filter(job测试工程师)
# 将payment字段原有的数据自增加一
v.update(paymentF(payment)1)2.3 bulk_create()
# 新增两行数据
v1Vocation.objects.create(job财务,title会计,name_id1)
v2Vocation.objects.create(job财务,title出纳,name_id1)
# 修改字段payment和title的数据
v1.payment1000
v2.title行政
# 批量修改字段payment和title的数据
Vocation.objects.bulk_update([v1,v2],fields[payment,title])3. 数据删除
数据删除必须执行一次数据查询再对查询结果进行删除操作若删除的数据设有外键字段则删除结果由外键的删除模式决定。
数据删除有3种方式删除数据表的全部数据、删除一行数据和删除多行数据实现方式如下
# 删除数据表中的全部数据
Vocation.objects.all().delete()
# 删除一条id为1的数据
Vocation.objects.get(id1).delete()
# 删除多条数据
Vocation.objects.filter(job测试员).delete()外键删除模式说明
PROTECT模式如果删除的数据设有外键字段并且关联其他数据表的数据就提示数据删除失败。SET_NULL模式执行数据删除并把其他数据表的外键字段设为Null外键字段必须将属性Null设为True否则提示异常。SET_DEFAULT模式执行数据删除并把其他数据表的外键字段设为默认值。SET模式执行数据删除并把其他数据表的外键字段关联其他数据。DO_NOTHING模式不做任何处理删除结果由数据库的删除模式决定。CASCADE模式执行数据删除时会删除所有依赖于这条记录的从表中的相关记录更新时也会更新所有从表中的记录。
4. 数据查询
数据查询分为单表查询和多表查询Django提供多种不同查询的API方法以满足开发需求。
4.1 单表查询
# SQLSelect * from index_vocation数据以列表返回
v Vocation.objects.all()
# 查询第一条数据序列从0开始
v[0].job
# 查询前3条数据
# SQLSelect * from index_vocation LIMIT 3
# SQL语句的LIMIT方法在Django中使用列表截取即可
v Vocation.objects.all()[:3]
# 查询某个字段
# SQLSelect job from index_vocation
# values方法数据以列表返回列表元素以字典表示
v Vocation.objects.values(job)
v[1][job]
# values_list方法数据以列表返回列表元素以元组表示
v Vocation.objects.values_list(job)[:3]
# 使用get方法查询数据
# SQLSelect*from index_vocation where id2
v Vocation.objects.get(id2)
# 使用filter方法查询数据注意区分get和filter的差异
v Vocation.objects.filter(id2)
v[0].job
# SQL的and查询主要在filter里面添加多个查询条件
v Vocation.objects.filter(job网站设计, id3)
#filter的查询条件可设为字典格式
ddict(job网站设计, id3)
v Vocation.objects.filter(**d)
# SQL的or查询需要引入Q编写格式Q(fieldvalue)|Q(fieldvalue)
#多个Q之间使用“|”隔开即可
# SQLSelect * from index_vocation where job网站设计 or id9
from django.db.models import Q
v Vocation.objects.filter(Q(job网站设计)|Q(id4))
# SQL的不等于查询在Q查询前面使用“~”即可
# SQL语句SELECT * FROM index_vocation WHERE NOT (job网站设计)
v Vocation.objects.filter(~Q(job网站设计))
#还可以使用exclude实现不等于查询
v Vocation.objects.exclude(job网站设计)
# 使用count方法统计查询数据的数据量
v Vocation.objects.filter(job网站设计).count()
# 去重查询distinct方法无须设置参数去重方式根据values设置的字段执行
# SQLSelect DISTINCT job from index_vocation where job 网站设计
v Vocation.objects.values(job).filter(job网站设计).distinct()
# 根据字段id降序排列降序只要在order_by里面的字段前面加-即可
# order_by可设置多字段排列如Vocation.objects.order_by(-id, job)
v Vocation.objects.order_by(-id)
# 聚合查询实现对数据值求和、求平均值等。由annotate和aggregate方法实现
# annotate类似于SQL里面的GROUP BY方法
#如果不设置values默认对主键进行GROUP BY分组
# SQLSelect job,SUM(id) AS id__sum from index_vocation GROUP BY job
from django.db.models import Sum, Count
v Vocation.objects.values(job).annotate(Sum(id))
# aggregate是计算某个字段的值并只返回计算结果
# SQLSelect COUNT(id) AS id_count from index_vocation
from django.db.models import Count
v Vocation.objects.aggregate(id_countCount(id))
# union、intersection和difference语法
# 每次查询结果的字段必须相同
# 第一次查询结果v1
v1 Vocation.objects.filter(payment__gt9000)
# 第二次查询结果v2
v2 Vocation.objects.filter(payment__gt5000)
# 使用SQL的UNION来组合两个或多个查询结果的并集
# 获取两次查询结果的并集
v1.union(v2)
# 使用SQL的INTERSECT来获取两个或多个查询结果的交集
# 获取两次查询结果的交集
v1.intersection(v2)
# 使用SQL的EXCEPT来获取两个或多个查询结果的差
# 以v2为目标数据去除v1和v2的共同数据
v2.difference(v1)上述的查询条件filter和get是使用等值的方法来匹配结果。若想使用大于、不等于或模糊查询的匹配方法则可在查询条件filter和get里使用下面所示的匹配符实现。
精确匹配Author.objects.filter(name__exactJohn Doe)模糊匹配Author.objects.filter(name__iexactjohn doe)不等于Author.objects.filter(name__neJohn Doe)包含Author.objects.filter(name__containsJohn)不区分大小写的包含Author.objects.filter(name__icontainsjohn)正则表达式匹配Author.objects.filter(name__regexr^[A-Za-z])
注意
查询条件get查询字段必须是主键或者唯一约束的字段并且查询的数据必须存在如果查询的字段有重复值或者查询的数据不存在程序就会抛出异常信息。查询条件filter查询字段没有限制只要该字段是数据表的某一字段即可。查询结果以列表形式返回如果查询结果为空查询的数据在数据表中找不到就返回空列表。
4.2 多表查询
在日常的开发中常常需要对多张数据表同时进行数据查询。多表查询需要在数据表之间建立表关系才能够实现。一对多或一对一的表关系是通过外键实现关联的而多表查询分为正向查询和反向查询。
# 正向查询
# 查询模型Vocation某行数据对象v
v Vocation.objects.filter(id1).first()
# v.name代表外键name
# 通过外键name去查询模型PersonInfo所对应的数据
v.name.hireDate
# 反向查询
# 查询模型PersonInfo某行数据对象p
p PersonInfo.objects.filter(id2).first()
# 方法一
# vocation_set的返回值为queryset对象即查询结果
# vocation_set的vocation为模型Vocation的名称小写
# 模型Vocation的外键字段name不能设置参数related_name
# 若设置参数related_name则无法使用vocation_set
v p.vocation_set.first()
v.job
# 方法二
# 由模型Vocation的外键字段name的参数related_name实现
# 外键字段name必须设置参数related_name才有效否则无法查询
# 将外键字段name的参数related_name设为personinfo
v p.personinfo.first()
v.job为了减少查询次数提高查询效率我们可以使用select_related或prefetch_related方法实现该方法只需执行一次SQL查询就能实现多表查询。
select_related主要针对一对一和一对多关系进行优化它是使用SQL的JOIN语句进行优化的通过减少SQL查询的次数来进行优化和提高性能其使用方法如下
# select_related方法参数为字符串格式
# 以模型PersonInfo为查询对象
# select_related使用LEFT OUTER JOIN方式查询两个数据表
# 查询模型PersonInfo的字段name和模型Vocation的字段payment
# select_related参数为personinfo代表外键字段name的参数related_name
# 若要得到其他数据表的关联数据则可用双下画线“__”连接字段名
# 双下画线“__”连接字段名必须是外键字段名或外键字段参数related_name
pPersonInfo.objects.select_related(personinfo).
values(name,personinfo__payment)
# 查看SQL查询语句
print(p.query)
# 以模型Vocation为查询对象
# select_related使用INNER JOIN方式查询两个数据表
# select_related的参数为name代表外键字段name
vVocation.objects.select_related(name).values(name,name__age)
# 查看SQL查询语句
print(v.query)
# 获取两个模型的数据以模型Vocation的payment大于8000为查询条件
vVocation.objects.select_related(name).
filter(payment__gt8000)
# 查看SQL查询语句
print(v.query)
# 获取查询结果集的首个元素的字段age的数据
# 通过外键字段name定位模型PersonInfo的字段age
v[0].name.age6. 执行SQL语句
执行SQL语句有3种方法实现extra、raw和execute其中extra和raw只能实现数据查询具有一定的局限性而execute无须经过ORM框架处理能够执行所有SQL语句但很容易受到SQL注入攻击。
extra结果集修改器一种提供额外查询参数的机制。 extra适合用于ORM难以实现的查询条件将查询条件使用原生SQL语法实现此方法需要依靠模型对象在某程度上可防止SQL注入
# 查询字段job等于‘网站设计’的数据
# params为where的%s提供数值
Vocation.objects.extra(where[job%s],params[网站设计])
QuerySet [Vocation: 3]
# 新增查询字段seatselect_params为select的%s提供数值
Vocation.objects.extra(select{seat:%s},
select_params[seatInfo])
print(v.query)
# 连接数据表index_personinfo
vVocation.objects.extra(tables[index_personinfo])
print(v.query)raw执行原始SQL并返回模型实例对象。 raw的语法和extra所实现的功能是相同的只能实现数据查询操作并且也要依靠模型对象但从使用角度来说raw更为直观易懂。
v Vocation.objects.raw(select * from index_vocation)
v[0]
Vocation: 1execute直接执行自定义SQL。 execute的语法它执行SQL语句无须经过Django的ORM框架。我们知道Django连接数据库需要借助第三方模块实现连接过程如MySQL的mysqlclient模块和SQLite的sqlite3模块等这些模块连接数据库之后可通过游标的方式来执行SQL语句而execute就是使用这种方式执行SQL语句
from django.db import connection
cursorconnection.cursor()
# 执行SQL语句
cursor.execute(select * from index_vocation)
# 读取第一行数据
cursor.fetchone()
# 读取所有数据
cursor.fetchall()execute能够执行所有的SQL语句但很容易受到SQL注入攻击一般情况下不建议使用这种方式实现数据操作。尽管如此它能补全ORM框架所缺失的功能如执行数据库的存储过程。
7. 数据库事务
数据库事务是指作为单个逻辑执行的一系列操作这些操作具有原子性即这些操作要么完全执行要么完全不执行常用于银行转账和火车票抢购等。
事务是指作为单个逻辑执行的一系列操作这些操作具有原子性即这些操作要么完全执行要么完全不执行。事务处理可以确保事务性单元内的所有操作都成功完成否则不会执行数据操作。 事务应该具有4个属性原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)这4个属性通常称为ACID特性。
Django中通过使用 atomic() 装饰器或 transaction.atomic() 上下文管理器来包装需要事务处理的代码块。
使用 atomic() 装饰器
from django.db import transactiontransaction.atomic
def view_func(request):# 在此函数内的数据库操作会被自动包装在事务中obj1 MyModel.objects.create(field1value1, field2value2)obj2 AnotherModel.objects.create(fieldvalue)# 如果任何数据库操作失败事务会回滚否则会提交
使用 transaction.atomic() 上下文管理器
from django.db import transactiondef view_func(request):with transaction.atomic():# 在此块内的数据库操作会被包装在事务中obj1 MyModel.objects.create(field1value1, field2value2)obj2 AnotherModel.objects.create(fieldvalue)# 如果任何数据库操作失败事务会回滚否则会提交 文章转载自: http://www.morning.gjmbk.cn.gov.cn.gjmbk.cn http://www.morning.gkdhf.cn.gov.cn.gkdhf.cn http://www.morning.pwksz.cn.gov.cn.pwksz.cn http://www.morning.zfhzx.cn.gov.cn.zfhzx.cn http://www.morning.rcklc.cn.gov.cn.rcklc.cn http://www.morning.xsymm.cn.gov.cn.xsymm.cn http://www.morning.pbksb.cn.gov.cn.pbksb.cn http://www.morning.mqwdh.cn.gov.cn.mqwdh.cn http://www.morning.mmplj.cn.gov.cn.mmplj.cn http://www.morning.dighk.com.gov.cn.dighk.com http://www.morning.qlpq.cn.gov.cn.qlpq.cn http://www.morning.gnghp.cn.gov.cn.gnghp.cn http://www.morning.rwmq.cn.gov.cn.rwmq.cn http://www.morning.dansj.com.gov.cn.dansj.com http://www.morning.wbyqy.cn.gov.cn.wbyqy.cn http://www.morning.gthc.cn.gov.cn.gthc.cn http://www.morning.czwed.com.gov.cn.czwed.com http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.wjjxr.cn.gov.cn.wjjxr.cn http://www.morning.dkfb.cn.gov.cn.dkfb.cn http://www.morning.nfpct.cn.gov.cn.nfpct.cn http://www.morning.btrfm.cn.gov.cn.btrfm.cn http://www.morning.cfjyr.cn.gov.cn.cfjyr.cn http://www.morning.grxyx.cn.gov.cn.grxyx.cn http://www.morning.qytyt.cn.gov.cn.qytyt.cn http://www.morning.wklrz.cn.gov.cn.wklrz.cn http://www.morning.wxfgg.cn.gov.cn.wxfgg.cn http://www.morning.bktly.cn.gov.cn.bktly.cn http://www.morning.pxjp.cn.gov.cn.pxjp.cn http://www.morning.hwbmn.cn.gov.cn.hwbmn.cn http://www.morning.qnbgh.cn.gov.cn.qnbgh.cn http://www.morning.qpnb.cn.gov.cn.qpnb.cn http://www.morning.jmdpp.cn.gov.cn.jmdpp.cn http://www.morning.yxwrr.cn.gov.cn.yxwrr.cn http://www.morning.lmxrt.cn.gov.cn.lmxrt.cn http://www.morning.dnqpq.cn.gov.cn.dnqpq.cn http://www.morning.qmwzr.cn.gov.cn.qmwzr.cn http://www.morning.dpmkn.cn.gov.cn.dpmkn.cn http://www.morning.hxycm.cn.gov.cn.hxycm.cn http://www.morning.qphcq.cn.gov.cn.qphcq.cn http://www.morning.mrxqd.cn.gov.cn.mrxqd.cn http://www.morning.dhyqg.cn.gov.cn.dhyqg.cn http://www.morning.kstlm.cn.gov.cn.kstlm.cn http://www.morning.fbrshjf.com.gov.cn.fbrshjf.com http://www.morning.nqpy.cn.gov.cn.nqpy.cn http://www.morning.nbybb.cn.gov.cn.nbybb.cn http://www.morning.rnqrl.cn.gov.cn.rnqrl.cn http://www.morning.wflsk.cn.gov.cn.wflsk.cn http://www.morning.jgcxh.cn.gov.cn.jgcxh.cn http://www.morning.qsctt.cn.gov.cn.qsctt.cn http://www.morning.lkhgq.cn.gov.cn.lkhgq.cn http://www.morning.qgfkn.cn.gov.cn.qgfkn.cn http://www.morning.bchhr.cn.gov.cn.bchhr.cn http://www.morning.bktly.cn.gov.cn.bktly.cn http://www.morning.guanszz.com.gov.cn.guanszz.com http://www.morning.bbtn.cn.gov.cn.bbtn.cn http://www.morning.pmptm.cn.gov.cn.pmptm.cn http://www.morning.yaqi6.com.gov.cn.yaqi6.com http://www.morning.rpgdd.cn.gov.cn.rpgdd.cn http://www.morning.rqknq.cn.gov.cn.rqknq.cn http://www.morning.zpqk.cn.gov.cn.zpqk.cn http://www.morning.wyjhq.cn.gov.cn.wyjhq.cn http://www.morning.ntgrn.cn.gov.cn.ntgrn.cn http://www.morning.fwqgy.cn.gov.cn.fwqgy.cn http://www.morning.rrwft.cn.gov.cn.rrwft.cn http://www.morning.dgsx.cn.gov.cn.dgsx.cn http://www.morning.wjmb.cn.gov.cn.wjmb.cn http://www.morning.zpyxl.cn.gov.cn.zpyxl.cn http://www.morning.czrcf.cn.gov.cn.czrcf.cn http://www.morning.gqksd.cn.gov.cn.gqksd.cn http://www.morning.cyjjp.cn.gov.cn.cyjjp.cn http://www.morning.nkrmh.cn.gov.cn.nkrmh.cn http://www.morning.rfbpq.cn.gov.cn.rfbpq.cn http://www.morning.bgbnc.cn.gov.cn.bgbnc.cn http://www.morning.ypklb.cn.gov.cn.ypklb.cn http://www.morning.hwnnm.cn.gov.cn.hwnnm.cn http://www.morning.kjsft.cn.gov.cn.kjsft.cn http://www.morning.mcfjq.cn.gov.cn.mcfjq.cn http://www.morning.bxnrx.cn.gov.cn.bxnrx.cn http://www.morning.brsgw.cn.gov.cn.brsgw.cn