row方法查询数据库

row方法查询数据库

ID:38260270

大小:24.82 KB

页数:7页

时间:2019-06-07

row方法查询数据库_第1页
row方法查询数据库_第2页
row方法查询数据库_第3页
row方法查询数据库_第4页
row方法查询数据库_第5页
资源描述:

《row方法查询数据库》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、进行原始的SQL查询¶在模型查询API不够用的情况下,你可以使用原始的SQL语句。Django提供两种方法使用原始SQL进行查询:一种是使用Manager.raw()方法,并进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的SQL语句。警告编写原始的SQL语句时,应该格外小心。 每次使用的时候,都要确保转义了参数中任何用户可以控制的字符,以防受到SQL注入攻击。更多信息请参阅防止SQL注入。进行原始查询¶raw() 管理器方法用于原始的SQL查询,并返回模型的实例:Manager.raw(raw_qu

2、ery, params=None, translations=None)¶这个方法执行原始的SQL查询,并返回一个django.db.models.query.RawQuerySet 实例。这个RawQuerySet 实例可以像一般的查询集那样,通过迭代来提供对象实例。这里最好通过例子展示一下, 假设存在以下模型:classPerson(models.Model):first_name=models.CharField(...)last_name=models.CharField(...)birth_date=mode

3、ls.DateField(...)你可以像这样执行自定义的SQL语句:>>>forpinPerson.objects.raw('SELECT*FROMmyapp_person'):...print(p)JohnSmithJaneJones当然,这个例子不是特别有趣——和直接使用Person.objects.all()的结果一模一样。但是,raw() 拥有其它更强大的使用方法。模型表的名称在上面的例子中,Person表的名称是从哪里得到的?通常,Django通过将模型的名称和模型的“应用标签”(你在manage.py s

4、tartapp中使用的名称)进行关联,用一条下划线连接他们,来组合表的名称。在这里我们假定Person模型存在于一个叫做myapp的应用中,所以表就应该叫做myapp_person。更多细节请查看db_table选项的文档,它也可以让你自定义表的名称。警告传递给 .raw()方法的sql语句并没有任何检查。django默认它会返回一个数据集,但这不是强制性的。 如果查询的结果不是数据集,则会产生一个错误。警告如果你在mysql上执行查询,注意在类型不一致的时候,mysql的静默类型强制可能导致意想不到的结果发生。 如果

5、你在一个字符串类型的列上查询一个整数类型的值,mysql会在比较前强制把每个值的类型转成整数。 例如,如果你的表中包含值'abc'和'def',你查询WHERE mycolumn=0,那么两行都会匹配。要防止这种情况,在查询中使用值之前,要做好正确的类型转换。警告虽然RawQuerySet可以像普通的QuerySet一样迭代,RawQuerySet并没有实现可以在 QuerySet上使用的所有方法。例如,__bool__()和__len__()在RawQuerySet中没有被定义,所以所有RawQuerySet转化为布

6、尔值的结果都是True。RawQuerySet中没有实现他们的原因是,在没有内部缓存的情况下会导致性能下降,而且增加内部缓存不向后兼容。将查询字段映射到模型字段¶raw()方法自动将查询字段映射到模型字段。字段的顺序并不重要。 换句话说,下面两种查询的作用相同:>>>Person.objects.raw('SELECTid,first_name,last_name,birth_dateFROMmyapp_person')...>>>Person.objects.raw('SELECTlast_name,birth_da

7、te,first_name,idFROMmyapp_person')...Django会根据名字进行匹配。 这意味着你可以使用SQL的AS子句来将查询中的字段映射成模型的字段。所以如果在其他的表中有一些Person数据,你可以很容易地把它们映射成Person实例:>>>Person.objects.raw('''SELECTfirstASfirst_name,...lastASlast_name,...bdASbirth_date,...pkASid,...FROMsome_other_table''')只要名字能对应

8、上,模型的实例就会被正确创建。 又或者,你可以在raw()方法中使用translations 参数。这个参数是一个字典,将查询中的字段名称映射为模型中的字段名称。例如,上面的查询可以写成这样:>>>name_map={'first':'first_name','last':'last_name','bd':'birth_date'

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。