Django运行SQL语句
方法/步骤11,经理。原始(原始查询,参数=无,翻译=无)
>。>。>。对于个人对象中的p,原始(& # 39;从myapp_person中选择* & 39;):
...打印(p)
约翰·史密斯
简·琼斯
这个方法接受一个原始的SQL查询,执行它,并返回一个django . db . models . query RawQuerySet实例。这个RawQuerySet实例可以像普通的QuerySet一样被遍历,以提供一个对象实例。
2(1)场匹配
>。>。>。原始(& # 39;& # 39;& # 39;选择第一个作为名字,
...姓氏作为姓氏,
...出生日期,
...主键身份标识,
...从某个_其他_表& # 39;& # 39;& # 39;)
>。>。>。name _ map = { & # 39第一& # 39;:& # 39;名字& # 39;,& # 39;最后一个& # 39;:& # 39;姓氏& # 39;,& # 39;bd & # 39:& # 39;出生日期& # 39;,& # 39;pk & # 39:& # 39;id & # 39}
>。>。>。原始(& # 39;从其他表格中选择。,翻译=name_map)
3(2)即使没有显示指示查询的字段,也可以获得该字段
>。>。>。对于个人对象中的p,原始(& # 39;选择id,名字来自myapp _ person & # 39):
...打印(p.first_name,#这将由原始查询检索
...p.last_name) #这将按需检索
...
约翰·史密斯
简·琼斯
4(3)使用参数执行SQL
字符串占位符%s
字典的占位符
>。>。>。lname = & # 39Doe & # 39
>。>。>。原始(& # 39;选择*发件人姓名= % s & # 39,[·英纳姆)
5(4)严禁串接
>。>。>。查询= & # 39;选择*发件人姓名= % s & # 39% lname
>。>。>。Person.objects.raw(查询)
6(5)参数不能用引号括起来
>。>。>。查询= & quot从我的联系人中选择*姓氏= & # 39;% s & # 39"
72.通过连接执行SQL。游标()
django.db.connection对象表示默认的数据库连接。若要使用数据库连接,请调用connection.cursor()来获取游标对象。然后调用游标. execute(sql,[参数)方法来执行sql
获取一个()或cursor.fetchone()以返回结果行。
从django.db导入连接
def my_custom_sql(自我):
将connection.cursor()作为光标:
光标。执行(& quot更新栏设置foo = 1,其中baz = %s"。,[自我介绍)
光标。执行(& quot从酒吧选择foo,其中baz = %s,[自我介绍)
row = cursor.fetchone()
返回行
8(1)通过百分比参数需要两个百分比符号
光标。执行(& quot在巴兹= & # 39;30% % & # 39;与id = % s & quot,[·赛尔夫)
9(2)光标执行不会返回列名
使用字典或命名元组
def dictfetchall(光标):
"将光标中的所有行作为字典返回
列=[列[0]用于光标中的列。描述]
返回[
dict(zip(列、行))
对于cursor.fetchall()中的行
]
从集合导入namedtuple
def namedtuplefetchall(光标):
"将光标中的所有行都作为名称返回
desc =光标。描述
nt _ result = named duple(& # 39;结果& # 39;,[上校[0]为desc上校)
为cursor.fetchall()中的行返回[nt _ result(*行)
>。>。>。光标。执行(& quot从测试限制2中选择id,父id);
>。>。>。dictfetchall(游标)
[{ & # 39;parent _ id & # 39:无,& # 39;id & # 39:54360982},{ & # 39;parent _ id & # 39:无,& # 39;id & # 39:54360880}]
目标