row方法查询数据库.docx
文本预览下载声明
进行原始的SQL查询/django_182/topics/db/sql.html?在/django_182/topics/db/queries.html模型查询API不够用的情况下,你可以使用原始的SQL语句。Django 提供两种方法使用原始SQL进行查询:一种是使用/django_182/topics/db/sql.htmlManager.raw()方法,并/django_182/topics/db/sql.html进行原始查询并返回模型实例;另一种是完全避开模型层,/django_182/topics/db/sql.html直接执行自定义的SQL语句。警告编写原始的SQL语句时,应该格外小心。?每次使用的时候,都要确保转义了参数中任何用户可以控制的字符,以防受到SQL注入攻击。更多信息请参阅/django_182/topics/security.html防止SQL注入。进行原始查询/django_182/topics/db/sql.html?raw()?管理器方法用于原始的SQL查询,并返回模型的实例:Manager.raw(raw_query,?params=None,?translations=None)/django_182/topics/db/sql.html?这个方法执行原始的SQL查询,并返回一个django.db.models.query.RawQuerySet?实例。这个RawQuerySet?实例可以像一般的/django_182/ref/models/querysets.html查询集那样,通过迭代来提供对象实例。这里最好通过例子展示一下,?假设存在以下模型:class Person(models.Model): first_name = models.CharField(...) last_name = models.CharField(...) birth_date = models.DateField(...)你可以像这样执行自定义的SQL语句: for p in Person.objects.raw(SELECT * FROM myapp_person):... print(p)John SmithJane Jones当然,这个例子不是特别有趣——和直接使用Person.objects.all()的结果一模一样。但是,raw()?拥有其它更强大的使用方法。模型表的名称在上面的例子中,Person表的名称是从哪里得到的?通常,Django通过将模型的名称和模型的“应用标签”(你在manage.py?startapp中使用的名称)进行关联,用一条下划线连接他们,来组合表的名称。在这里我们假定Person模型存在于一个叫做myapp的应用中,所以表就应该叫做myapp_person。更多细节请查看/django_182/ref/models/options.htmldb_table选项的文档,它也可以让你自定义表的名称。警告传递给?.raw()方法的sql语句并没有任何检查。django默认它会返回一个数据集,但这不是强制性的。?如果查询的结果不是数据集,则会产生一个错误。警告如果你在mysql上执行查询,注意在类型不一致的时候,mysql的静默类型强制可能导致意想不到的结果发生。?如果你在一个字符串类型的列上查询一个整数类型的值,mysql会在比较前强制把每个值的类型转成整数。?例如,如果你的表中包含值abc和def,你查询WHERE?mycolumn=0,那么两行都会匹配。要防止这种情况,在查询中使用值之前,要做好正确的类型转换。警告虽然RawQuerySet可以像普通的/django_182/ref/models/querysets.htmlQuerySet一样迭代,RawQuerySet并没有实现可以在?QuerySet上使用的所有方法。例如,__bool__()和__len__()在RawQuerySet中没有被定义,所以所有RawQuerySet转化为布尔值的结果都是True。RawQuerySet中没有实现他们的原因是,在没有内部缓存的情况下会导致性能下降,而且增加内部缓存不向后兼容。将查询字段映射到模型字段/django_182/topics/db/sql.html?raw()方法自动将查询字段映射到模型字段。字段的顺序并不重要。?换句话说,下面两种查询的作用相同: Person.objects.raw(SELECT id, first_name, last_name, birth_date FROM myapp_person)... Person.objects.raw(SELECT last_name, birth_date, first_name, id FROM myapp
显示全部