Django提供两种方式执行(performing)原始的SQL查询:
(1)?、?Manager.raw()?:执行原始查询并返回模型实例
(2)?、?Executing custom SQL directly?:直接执行自定义SQL,这种方式可以完全避免数据模型,而是直接执行原始的SQL语句。
三、raw()方法
The?raw()?manager method can be used to perform raw SQL queries that return model instances:?
Manager.?raw?(?raw_query?,?params=None?,?translations=None?)
用法:?
?注意,原始SQL里的model,如果在?db_table?没有定义,则使用app的名称,后面下划线 后面接模型类的名称,如"Myblog_New";上面的例子,在定义类的时候已经这样处理了:
?2、查询字段隐射到模型字段(Mapping query fields to model fields)
raw()?automatically maps fields in the query to fields on the model.并且是通过名称来匹配,这意味着我们可以使用SQL子句(clause)
?返回一个RawQuerySet对象
3、索引查找(Index lookups)
4、延迟模型字段(Deferring model fields)
Fields may also be left out(left out:忽视,不考虑;被遗忘),这意味着该字段的查询将会被排除在根据需要时的加载。
?这个例子其实检索了三个字段,一个主键(必需)、一个原始SQL字段、一个需求字段。这里主键字段不能省略,否则??出错,如下:?
5、传递参数(Passing parameters into?raw()?)
如果需要执行参数化查询,您可以使用params参数原始()?
注意两点:?(1)、
(2)、必须使用[参数],否则出错:?
? ? ? ? ? ? ? ? (3)、这种方式不对:
?四、直接执行自定义SQL
Manager.raw()?远远不够,可直接执行自定义SQL,directly execute?UPDATE?,?INSERT?, or?DELETE?queries.
? django.db.connections?:针对使用多个数据库
?通常我们不需要手动调用?transaction.commit_unless_managed(?),我们可以这样做:
下面关于Python的文章您也可能喜欢,不妨看看: